假设我有这个项目结构:
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文件与它所在的位置无关...... 答案 0 :(得分:3)
如果你在docker-compose.yaml
中使用以下语法,图像将由master构建一次,然后由slave使用:
version: '3'
services:
master:
build: docker/myservice
image: master-image:3
slave:
image: master-image:3
答案 1 :(得分:3)
Docker Compose使用名称proj_master
构建您的图片,因为您未在Compose文件中的master
服务下指定图像名称。
您有一个build
部分,因此Docker Compose会构建图片并根据您的<directory_name_where_you_run_compose>_<service_name>:latest
为其命名。我没有在文档中找到这个,但尝试了我的一个项目,它与你的经历一致。
您可以通过在Compose文件中指定图像名称并为两种服务使用相同的图像来修复项目:
version: '3'
services:
master:
build: docker/myservice
image: username/masterimage:version
slave:
image: username/masterimage:version
depends_on: master
答案 2 :(得分:2)
此功能称为extension fields。
您只需将您的奴隶链接到您的主人。
django_project:
&django_project
image: python:3.7.6-alpine
command: ....
django_project_task1:
<<: *django_project
command: /start-task1.sh
django_project_task2:
<<: *django_project
command: /start-task2.sh
现在所有人共享相同的源,但是使用不同的命令来启动。
此外,您还必须了解一件事。
由于Docker使用“层”,因此不会为每个“子过程”重新编译Dockerfile,并且会缩小卷大小。
也请查看有关running multiple process in one container的这篇文章。
很酷,是吧?