如何从另一个 Dockerfile 获取 Dockerfile?

Dum*_*mmy 21 docker dockerfile docker-compose

我有一个应用程序,有两个Dockerfile,比如说Dockerfile.fooDockerfile.bar,预计会为 的两个不同服务生成两个不同的图像docker-compose.yml

例如,它可能看起来像:

# ...
services:
  service1:
    build:
      context: .
      dockerfile: Dockerfile.foo
  service1:
    build:
      context: .
      dockerfile: Dockerfile.bar
# ...
Run Code Online (Sandbox Code Playgroud)

但两者的Dockerfile.{foo,bar}前半部分相同,而左侧部分不同。

如何通过.{foo,bar}从基础进行扩展来避免不必要的重复构建和维护麻烦Dockerfile.common?换句话说,是否可以归档类似FROM Dockerfile.commoninside 的内容docker-compose.yml


更新:

我期望的是使用docker-compose自动化构建过程,而无需手动(或单独build.sh)运行:

  1. docker build -f Dockerfile.common -t common .首先;
  2. 然后就docker build -f Dockerfile.foo -t foo . && docker build -f Dockerfile.bar -t bar .可以Dockerfile.{foo, bar}正确引用common图像了。

edr*_*evo 15

如果你想避免使用不必要的中间标签并且使用 Docker 20.10+,你也可以这样做:

# syntax = edrevo/dockerfile-plus

INCLUDE+ Dockerfile.common

# The rest of Dockerfile.foo would go after the INCLUDE+ instruction

RUN echo "Hello World"
Run Code Online (Sandbox Code Playgroud)

INCLUDE+指令由 Dockerfile 中的第一行导入。您可以在https://github.com/edrevo/dockerfile-plus阅读有关 dockerfile-plus 的更多信息


Mig*_*g82 5

我只是偶尔接触一下 Docker,所以我不确定是否有更好、更 Docker 风格的方法来做到这一点,但我使用了一个很好的旧 makefile。

生成文件

common:
    docker build -f Dockerfile.common -t common .

foo: common
    docker build -f Dockerfile.foo -t foo .

bar: common
    docker build -f Dockerfile.bar -t bar .

build: foo bar
    echo "Done!"
Run Code Online (Sandbox Code Playgroud)

然后运行:

make build
Run Code Online (Sandbox Code Playgroud)

我不知道 Docker Compose 是否也可以以更好、更优雅的方式做到这一点,但这对我有用,而无需学习和安装新工具;)

  • 不,docker-compose 只是用于编排(以某种方式),因此您可以使用它来同时运行容器。这不是你想要的。不管怎样,我喜欢你建议的 makfefile-way! (2认同)

sam*_*den -1

FROM用于拉取基础镜像来使用。当然,该图像有一个地方,但这在使用该图像的Dockerfile新版本中并不重要。Dockerfile

因此,创建一个 mainDockerfile_commongenerated_image_with_Dockerfile_common从那里生成一个图像(使用docker build),其中包含其他图像中需要的基本内容。

然后,在您的Dockerfile_foo和中Dockerfile_bar,使用FROM generated_image_with_Dockerfile_common它们并用您想要的内容完成它们。

  • 你读过这个问题吗?这正是需要解决方案的不良情况 (2认同)