【发布时间】:2021-10-27 09:50:54
【问题描述】:
上下文
我有一个带有两个容器的 pod:
-
main,其简单的工作就是显示目录的内容 -
sidecar负责将 blob 存储的内容同步到预定义目录中
为了使同步是原子的,sidecar 将 blob 存储内容下载到新的临时目录中,然后在目标目录中切换符号链接。
目标目录使用emptyDir 卷在两个容器之间共享。
问题
main 有符号链接,但不能列出后面的内容。
问题
如何获取最新的同步数据?
附加信息
原因
我尝试使用Git-Sync 实现Apache Airflow 所做的工作,但是,我需要从 Azure Blob 存储同步文件,而不是使用 Git。这是必要的,因为 (1) 我的内容大部分是动态的,并且 (2) azureFile 卷类型有一些严重的 performance issues。
同步例程
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
解决方案
我最初的尝试有两个错误:
- 卷中不存在符号链接目标
- 符号链接目标指向 sidecar 容器中的绝对路径,因此,从主容器的角度来看,该文件夹不存在
这是修改后的例程:
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"
【问题讨论】:
-
你能提供一个更完整的例子吗?符号链接实际上只是目录条目中的文件路径,仅此而已,因此如果实际内容不在卷内,则符号链接不一定指向它。
标签: linux kubernetes airflow symlink persistent-volumes