上下文
我有一个带有两个容器的 pod:
main
其简单工作是显示目录的内容- 负责将 Blob 存储的内容同步到预定义目录中
sidecar
为了使同步是原子同步,sidecar
将 Blob 存储内容下载到新的临时目录中,然后在目标目录中切换符号链接。
目标目录使用emptyDir
卷在两个容器之间共享。
问题
main
具有符号链接,但无法列出后面的内容。
问题
如何访问最新的同步数据?
其他信息
原因
我尝试使用 Git-Sync 实现 Apache Airflow 正在完成的工作,但我需要从 Azure Blob 存储同步文件,而不是使用 Git。这是必要的,因为 (1) 我的内容主要是动态的,(2)azureFile
卷类型存在一些严重的性能问题。
同步例程
declare -r container='https://mystorageaccount.dfs.core.windows.net/mycontainer'
declare -r destination='/shared/container'
declare -r temp_dir="$(mktemp -d)"
azcopy copy --recursive "$container/*" "$temp_dir"
declare -r temp_file="$(mktemp)"
ln -sf "$temp_dir" "$temp_file"
mv -Tf "$temp_file" "$destination"
我们最终得到的结果:
$ ls /shared
container -> /tmp/tmp.doGz2U0QNy
$ ls /shared/container
file1.txt file2.txt
溶液
我最初的尝试有两个错误:
- 卷中不存在符号链接目标
- 符号链接目标指向挎斗容器中的绝对路径,因此,从主容器的角度来看,该文件夹不存在
以下是修改后的例程:
declare -r container='https://mystorageaccount.dfs.core.windows.net/mycontainer'
declare -r destination='/shared/container'
declare -r cache_dir="$(dirname $destination)"
declare -r temp_dir="$(mktemp -d -p $cache_dir)"
azcopy copy --recursive "$container/*" "$temp_dir"
ln -sf "$(basename $temp_dir)" "$cache_dir/symlink"
mv -Tf "$cache_dir/symlink" "$destination"
符号链接只是一种包含文件名的特殊文件;它实际上并不以任何有意义的方式包含文件内容,也不必指向存在的文件。默认情况下,mktemp(1) 会在/tmp
中创建目录,而该目录可能不在共享卷中。
想象一下,将一个物理文件夹放在物理文件柜中,在便利贴上写the third drawer at the very front
,然后开车到另一栋楼,然后将便笺交给同事。 便利贴(符号链接)仍然存在,但在其他建筑物(容器文件系统)的上下文中,它命名的位置并不是特别有意义。
解决此问题的最简单方法是要求mktemp
直接在目标卷中创建文件,然后创建相对路径符号链接。
# extract the volume location (you may already have this)
volume_dir=$(dirname "$destination")
# force the download location to be inside the volume
# (mktemp --tmpdir option)
temp_dir=$(mktemp -d --tmpdir "$volume_dir")
# actually do the download
azcopy copy --recursive "$container/*" "$temp_dir"
# set the symlink to a relative-path symlink, since the directory
# and the link are in the same place; avoids problems if the volume
# is mounted in different places in the two containers
ln -sf $(basename "$temp_dir") "$destination"