docker compose volume to existing directory将隐藏同一父目录中的现有文件

docker compose volume to existing directory将隐藏同一父目录中的现有文件,docker,docker-compose,presto,docker-volume,trino,Docker,Docker Compose,Presto,Docker Volume,Trino,在使用docker compose处理prestosql映像时,我遇到了一个特殊的问题 如果将compose配置为将卷装载到映像中的现有目录,则当容器启动时,与装载点位于同一级别的所有文件都将消失。父目录中的所有其他文件消失,只剩下装入点(其中包含正确的卷内容) 我的docker-compose.yml如下所示: version: '2.2' services: prestosql: image: prestosql/presto:329 volumes: -

在使用docker compose处理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/
如果我在prestosql容器中执行一个bash并调用
/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
[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
但是,如果我在没有卷配置的情况下重复该过程,并将
/usr/lib/presto/etc/
设置为ls,我会得到:

[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
[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
在容器上运行inspect仅显示装载上的卷:

❯ docker inspect -f '{{ .Mounts }}' 7df706ccb1bc
[{bind  /blablabla/src/test/resources/presto/catalog /usr/lib/presto/etc/catalog  rw true rprivate}]
这是预期的行为吗

这是预期的行为吗

可能不是“预期”本身,但是的,这种行为是出于设计:


似乎presto映像本身并不包含
/usr/lib/presto/etc/
目录,但当容器启动入口点(运行presto)时,会以这种方式创建一个从
/usr/lib/presto/default/etc
/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
下的任何位置,则不会创建此链接,因此您最终会在该目录层次结构下拥有一个文件

解决方案非常简单,只需将文件挂载在
/usr/lib/presto/default/etc
下即可:

...
volumes:
   - ./src/test/resources/presto/catalog/:/usr/lib/presto/default/etc/catalog/
正如一些补充说明:根据他们的文档:

配置应安装到/etc/presto或/usr/lib/presto/etc(后者优先)。如果两者都不存在,则将使用默认的单节点配置


似乎他们希望整个配置(即etc下的所有内容)都应该作为一个整体安装到/etc/presto或/usr/lib/presto/etc,因此他们不希望添加/替换单个文件,这就是为什么您的方法没有按您希望的方式工作

问题不在于挂载目录,而在于挂载目录父目录。就是这样!非常感谢你的帮助。这根本不是码头工人的问题。