假设我有这样的项目结构:
proj/
├── docker
│ └── myservice
│ └── Dockerfile
└── docker-compose.yml
这是我的docker-compose.yml
:
version: '3'
services:
master:
build: docker/myservice
slave:
image: proj_master
depends_on: master
我希望master
服务创建一个映像,该映像将由master
和slave
服务使用(使用不同的参数,此处未显示)。通过反复试验,我发现从服务必须引用映像proj_master
。
- 这在哪里记录?
- 为什么我需要引用
proj
?通常一个docker composer文件与它的位置有关是不可知的。
4条答案
按热度按时间yxyvkwin1#
Docker合成使用名称
proj_master
构建图像,因为您没有在合成文件的master
服务下指定图像名称。您有一个
build
节,因此Docker Compose将构建映像并基于您的<directory_name_where_you_run_compose>_<service_name>:latest
为其命名。我在文档中没有找到这个,但在我的一个项目中尝试过,它与您的体验一致。您可以通过在合成文件中指定图像名称并对两个服务使用相同的图像来修复项目:
1mrurvl12#
此功能称为扩展字段。
你可以把你的奴隶和你的主人联系起来。
现在,所有共享相同的源,但使用不同的命令启动。
另外,你还得明白一件事。
由于Docker使用“层”,您的Dockerfile不会为每个“子进程”重新编译,卷大小将缩小。
有一个完美的article on this topic
也可以查看这篇关于running multiple process in one container的文章。
很酷的黑客,是吧?
s8vozzvw3#
如果您在
docker-compose.yaml
中使用以下语法,主映像将构建一次,然后由从映像使用:qyyhg6bp4#
如果没有
pull_policy
,docker compose
可以正常工作,但对从机显示红色错误,对主机显示警告:从动牵拉
主拉力
从属错误
主警告
More infos: https://github.com/docker/compose/issues/9820 , https://docs.docker.com/compose/compose-file/#pull_policy
拉取策略:从不
合成实现不应该从注册表中拉取映像[...]
其他备注:
depends_on
in this context ("expresses startup and shutdown dependencies between services"), see https://docs.docker.com/compose/compose-file/#depends_onversion: '3'
, this field is deprecated https://github.com/compose-spec/compose-spec/blob/7d5c7c88676ac240b6b037f868c04b33f738d82a/spec.md#compose-file and also it is the equivalent of'3.0'
instead of using the latest minor version https://docs.docker.com/compose/compose-file/compose-versioning/#version-3