Dockerfile 和开发/测试/生产环境

5
我想创建一个Dockerfile,可以构建三个不同的镜像(目前只有一个)。这些镜像仅在配置文件方面有所不同。
我尝试了以下几种方法:
1. 创建三个不同的Docker文件(不起作用,因为Dockerfile需要命名为Dockerfile并位于上下文根目录中); 2. 查找传递参数到docker build命令的方法-未找到; 3. 使用ONBUILD命令-我创建了一个主文件和三个特定的文件,它们将特定的conf文件复制到镜像中相同的目录中(由于第一点中的原因,它不起作用); 4. 从stdin传递Docker文件-这不起作用,因为那时没有上下文(因此我无法使用ADD/COPY命令)。
我必须说我已经没有更多的想法了。你如何处理这种情况?在我看来,这应该是一个常见的问题。

2
考虑将运行时配置作为环境设置传递给单个图像。这样,您可以在开发中创建一个图像,在测试中验证相同的图像,并确信它在生产中以相同的方式运行。在我看来,为每个部署创建新的二进制工件是一种反模式。 - Mark O'Connor
我已经发布了一个更一般性的问题:https://dev59.com/aJTfa4cB1Zd3GeqPTaKc - Vanuan
3个回答

5
为什么不在Dockerfile中复制所有3个配置文件,然后使用docker run -e config=file1(或file2或file3)并使用config环境变量的值来获取所需的配置文件。请查看文档http://docs.docker.com/reference/commandline/cli/#run
您还可以使用--env-file=[] 读取以行分隔的环境变量文件docker run命令。
您可以使用docker run -it -e mytag=abc123 ubuntu:latest env | grep mytag检查环境变量是否可用,显示mytag=abc123

0

如果你想要3张不同的图片,就使用3个不同的Dockerfiles。命名问题很烦人,但你可以编写一个帮助脚本,简单地复制文件并调用docker build

cp Dockerfile-cfg1 Dockerfile
docker build -t "cfg1" .
cp Dockerfile-cfg2 Dockerfile
docker build -t "cfg2" .

然而,正如@user2915097所建议的那样,更好的解决方案可能是拥有一个单一的图像并在运行时选择配置。这意味着需要更少的开销来维护和管理多个图像。

0

我已经添加了三个不同的文件:

test.Dockerfile
dev.Dockerfile
prod.Dockerfile

而我是使用文件名来运行它们的:

docker build -t name/name -f test.Dockerfile .
docker build -t name/name -f dev.Dockerfile .
docker build -t name/name -f prod.Dockerfile .

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接