Dum*_*mmy 21 docker dockerfile docker-compose
我有一个应用程序,有两个Dockerfile,比如说Dockerfile.foo和Dockerfile.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)运行:
docker build -f Dockerfile.common -t common .首先;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 的更多信息
我只是偶尔接触一下 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 是否也可以以更好、更优雅的方式做到这一点,但这对我有用,而无需学习和安装新工具;)
sam*_*den -1
FROM用于拉取基础镜像来使用。当然,该图像有一个地方,但这在使用该图像的Dockerfile新版本中并不重要。Dockerfile
因此,创建一个 mainDockerfile_common并generated_image_with_Dockerfile_common从那里生成一个图像(使用docker build),其中包含其他图像中需要的基本内容。
然后,在您的Dockerfile_foo和中Dockerfile_bar,使用FROM generated_image_with_Dockerfile_common它们并用您想要的内容完成它们。
| 归档时间: |
|
| 查看次数: |
17146 次 |
| 最近记录: |