docker 将卷组合到现有目录隐藏同一父目录中的现有文件
docker compose volume to existing directory hides existing files in the same parent dir
在使用 docker 与 prestosql 图像组合时,我 运行 遇到了一个特定的问题。
如果我将 compose 配置为将卷挂载到映像中的现有目录,当容器启动时,与挂载点位于同一控制杆中的所有文件都会消失。父目录中的所有其他文件都消失了,只剩下挂载点(里面有适当的卷内容)
我的docker-compose.yml如下:
version: '2.2'
services:
prestosql:
image: prestosql/presto:329
volumes:
- ./src/test/resources/presto/catalog/:/usr/lib/presto/etc/catalog/
如果我将 bash 执行到 prestosql 容器中并执行 /usr/lib/presto/etc/
我得到:
[presto@7df706ccb1bc presto]$ ls -lah /usr/lib/presto/etc/
total 8.0K
drwxr-xr-x 3 root root 4.0K Jan 30 15:12 .
drwxr-xr-x 1 presto presto 4.0K Jan 30 15:12 ..
drwxr-xr-x 4 presto presto 128 Jan 25 18:09 catalog
但是,如果我在没有卷配置的情况下重复该过程并且 ls /usr/lib/presto/etc/
我得到:
[presto@7b2c2178f6e9 /]$ ls -lah /usr/lib/presto/etc/
total 28K
drwxr-xr-x 3 presto presto 4.0K Jan 23 12:22 .
drwxr-xr-x 3 presto presto 4.0K Jan 23 12:22 ..
drwxr-xr-x 2 presto presto 4.0K Jan 23 12:22 catalog
-rw-r--r-- 1 presto presto 178 Jan 23 12:22 config.properties
-rw-r--r-- 1 presto presto 295 Jan 23 12:22 jvm.config
-rw-r--r-- 1 presto presto 57 Jan 23 12:22 log.properties
-rw-r--r-- 1 presto presto 85 Jan 23 12:22 node.properties
运行 对容器的检查仅显示装载上的卷:
❯ docker inspect -f '{{ .Mounts }}' 7df706ccb1bc
[{bind /blablabla/src/test/resources/presto/catalog /usr/lib/presto/etc/catalog rw true rprivate}]
这是预期的行为吗?
Is this expected behaviour?
可能不是 "expected" 本身,但是是的,这种行为是设计使然:
presto 镜像本身似乎不包含 /usr/lib/presto/etc/
目录,但是当容器启动入口点 (运行-presto) 从 [= 创建一个 symlink 13=] 到 /usr/lib/presto/etc
这样:
if [[ ! -d /usr/lib/presto/etc ]]; then
if [[ -d /etc/presto ]]; then
ln -s /etc/presto /usr/lib/presto/etc
else
ln -s /usr/lib/presto/default/etc /usr/lib/presto/etc
fi
fi
所以基本上,如果您将文件挂载到 /usr/lib/presto/etc
下的任何位置,则不会创建此 link,因此您最终会在该目录层次结构下拥有一个文件。
解决方法很简单,只需将文件挂载到 /usr/lib/presto/default/etc
下即可:
...
volumes:
- ./src/test/resources/presto/catalog/:/usr/lib/presto/default/etc/catalog/
正如一些附加说明:根据他们的文档:
Configuration is expected to be mounted to either to /etc/presto or /usr/lib/presto/etc (the latter takes precedence). If neither of these exists then the default single node configuration will be used.
他们似乎希望将整个配置(即 etc 下的所有内容)作为一个整体安装到 /etc/presto 或 /usr/lib/presto/etc,因此他们不希望单个文件是 added/replaced 这就是为什么你的方法没有按照你想要的方式工作。
在使用 docker 与 prestosql 图像组合时,我 运行 遇到了一个特定的问题。
如果我将 compose 配置为将卷挂载到映像中的现有目录,当容器启动时,与挂载点位于同一控制杆中的所有文件都会消失。父目录中的所有其他文件都消失了,只剩下挂载点(里面有适当的卷内容)
我的docker-compose.yml如下:
version: '2.2'
services:
prestosql:
image: prestosql/presto:329
volumes:
- ./src/test/resources/presto/catalog/:/usr/lib/presto/etc/catalog/
如果我将 bash 执行到 prestosql 容器中并执行 /usr/lib/presto/etc/
我得到:
[presto@7df706ccb1bc presto]$ ls -lah /usr/lib/presto/etc/
total 8.0K
drwxr-xr-x 3 root root 4.0K Jan 30 15:12 .
drwxr-xr-x 1 presto presto 4.0K Jan 30 15:12 ..
drwxr-xr-x 4 presto presto 128 Jan 25 18:09 catalog
但是,如果我在没有卷配置的情况下重复该过程并且 ls /usr/lib/presto/etc/
我得到:
[presto@7b2c2178f6e9 /]$ ls -lah /usr/lib/presto/etc/
total 28K
drwxr-xr-x 3 presto presto 4.0K Jan 23 12:22 .
drwxr-xr-x 3 presto presto 4.0K Jan 23 12:22 ..
drwxr-xr-x 2 presto presto 4.0K Jan 23 12:22 catalog
-rw-r--r-- 1 presto presto 178 Jan 23 12:22 config.properties
-rw-r--r-- 1 presto presto 295 Jan 23 12:22 jvm.config
-rw-r--r-- 1 presto presto 57 Jan 23 12:22 log.properties
-rw-r--r-- 1 presto presto 85 Jan 23 12:22 node.properties
运行 对容器的检查仅显示装载上的卷:
❯ docker inspect -f '{{ .Mounts }}' 7df706ccb1bc
[{bind /blablabla/src/test/resources/presto/catalog /usr/lib/presto/etc/catalog rw true rprivate}]
这是预期的行为吗?
Is this expected behaviour?
可能不是 "expected" 本身,但是是的,这种行为是设计使然:
presto 镜像本身似乎不包含 /usr/lib/presto/etc/
目录,但是当容器启动入口点 (运行-presto) 从 [= 创建一个 symlink 13=] 到 /usr/lib/presto/etc
这样:
if [[ ! -d /usr/lib/presto/etc ]]; then
if [[ -d /etc/presto ]]; then
ln -s /etc/presto /usr/lib/presto/etc
else
ln -s /usr/lib/presto/default/etc /usr/lib/presto/etc
fi
fi
所以基本上,如果您将文件挂载到 /usr/lib/presto/etc
下的任何位置,则不会创建此 link,因此您最终会在该目录层次结构下拥有一个文件。
解决方法很简单,只需将文件挂载到 /usr/lib/presto/default/etc
下即可:
...
volumes:
- ./src/test/resources/presto/catalog/:/usr/lib/presto/default/etc/catalog/
正如一些附加说明:根据他们的文档:
Configuration is expected to be mounted to either to /etc/presto or /usr/lib/presto/etc (the latter takes precedence). If neither of these exists then the default single node configuration will be used.
他们似乎希望将整个配置(即 etc 下的所有内容)作为一个整体安装到 /etc/presto 或 /usr/lib/presto/etc,因此他们不希望单个文件是 added/replaced 这就是为什么你的方法没有按照你想要的方式工作。