我试图用相同的图像构建两个服务,但两个不同的Dockerfile。然而,Docker将始终只使用一个Dockerfile用于这两个文件,即使已经定义了两个:
version: '3.4'
services:
serviceA:
image: myimage
build:
dockerfile: ./Dockerfile
context: ${project.basedir}/${project.artifactId}-docker/target
depends_on:
- serviceB
serviceB:
image: myimage
build:
dockerfile: ./Dockerfile-cloud
context: ${project.basedir}/${project.artifactId}-docker/target
尽管我也写了dependsOn, running
docker-compose up -f docker-compose.yml
它只使用Dockerfile-cloud。
我猜你的问题是你的图像标记为myimage
(默认使用最新)。所以docker会用Dockerfile
构建第一个版本的myimage
,然后用Dockerfile-cloud
构建另一个版本的myimage
,最后它只会使用最新的版本。这就是为什么它会同时使用Dockerfile-cloud。要修复它,请删除image: myimage
或执行以下操作:
serviceA:
image: myimage:serviceA
...
serviceB:
image: myimage:serviceB
因为你是从不同的Dockerfiles构建两个容器的图像,它们不能真正是相同的图像;它们将有不同的内容和元数据。
Compose能够为它生成的各种东西分配唯一的名称。除非您需要将docker-compose push
构建的映像添加到注册表中,否则通常可以省略image:
行。这两个容器将使用从它们自己的dockerfile构建的独立映像,并且由composer分配的名称将避免您在这里遇到的歧义。
version: '3.8'
services:
serviceA:
# no image:
# short form of build: with default dockerfile: and no args:
build: ${project.basedir}/${project.artifactId}-docker/target
depends_on:
- serviceB
serviceB:
# no image:
build:
context: ${project.basedir}/${project.artifactId}-docker/target
dockerfile: ./Dockerfile-cloud