如何使Docker卷主机路径与命令执行的工作目录相对?
问题描述
目录结构
├── docker-compose.yml ├── folder1 │ ├── docker-compose.yml │ └── volume1 │ └── source └── volume └── source
根目录docker-compose.yml内容
version: "3.4" services: service: image: hello-world volumes: - ./volume/source:/volume/destination command: sleep 180
folder1目录下docker-compose.yml内容
version: "3.4" services: service1: image: hello-world volumes: - ${PWD}/volume1/source:/volume1/destination command: - sleep 180
执行命令及输出
在根目录执行以下命令:
docker-compose -f docker-compose.yml -f folder1/docker-compose.yml config
得到输出:
services: service: command: sleep 180 image: hello-world volumes: - /home/user/repos/learn/dockerl-compose/volume/source:/volume/destination:rw service1: command: - sleep 180 image: hello-world volumes: - /home/user/repos/learn/dockerl-compose/volume1/source:/volume1/destination:rw version: '3.4'
问题:如何使主机上绑定挂载的路径与对应Compose文件所在的目录相对(而非命令执行的根目录)?
解决方案
要让绑定挂载路径基于Compose文件所在目录而非命令执行的工作目录,只需调整folder1/docker-compose.yml中的挂载路径:
将${PWD}/volume1/source改为相对路径./volume1/source,修改后的文件内容如下:
version: "3.4" services: service1: image: hello-world volumes: - ./volume1/source:/volume1/destination command: - sleep 180
再次执行原命令后,service1的挂载路径会被正确解析为/home/user/repos/learn/dockerl-compose/folder1/volume1/source,而根目录service的挂载路径仍基于根目录解析,两者分别对应各自Compose文件所在的目录。
核心逻辑:Docker Compose默认会基于当前加载的Compose文件所在目录解析相对路径,而${PWD}会强制使用命令执行时的工作目录,导致路径错误,改用相对路径即可恢复预期行为。
内容的提问来源于stack exchange,提问作者naraghi
相关产品推荐
相关产品推荐

