Docker-Compose: Bash命令替换

5
我正在编写 docker-compose.yml 文件,其中应用程序应该可以从容器内部访问 Docker(Docker in Docker),参考此处的博客文章: https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ 问题是我需要连接主机 Docker 二进制文件,但是我不知道目标系统上 Docker 的确切路径,在某些系统上可能是 /bin/docker,在其他系统上可能是 /usr/local/bin/docker 等。
我想要一个跨平台的解决方案,只需像这样放置一些内容:
volumes:
  - $(which docker):/bin/docker

能否将其添加到docker-compose.yml中?

Docker-Compose是否支持此操作?


2
为什么不在你的镜像中包含Docker二进制文件呢? - Oliver Charlesworth
Oliver,对于这种特殊情况确实有帮助,但是对于通用情况呢?例如,如果我想映射的不是Docker和二进制文件,而是一些在不同主机上可能不同的文件夹怎么办? - Oleksandr Horobets
1
https://docs.docker.com/compose/compose-file/#variable-substitution - Oliver Charlesworth
1个回答

5
实际上,将Docker二进制文件挂载是一个不好的想法,因为新版本有动态二进制文件,所以您还需要发现并挂载所有所需的库。相反,正如Oliver建议的那样,更容易在容器内直接安装Docker,并将其指向主机上的套接字。请注意,如果主机和容器中有不同版本的Docker,则可能会出现问题。然而,您可以在最新版本的Compose中使用shell环境变量来回答这个问题。在您的Dockerfile中,您可以这样做:
volumes:
  - ${DOCKER_PATH}:/bin/docker

当您调用compose时:

DOCKER_PATH="$(which docker)" && docker-compose up

完整文档在此处https://docs.docker.com/compose/compose-file/#variable-substitution

@luckydonald 确实。我已经添加了一个答案。我还没有测试过代码,所以可能需要一些修复。 - Adrian Mouat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接