我想知道是否可以在docker中使用env变量?原因是控制标记。例如,假设我在Dockerfile中有这一行:
From myApp
我想要的是:
From myApp:${VERSION}
这样我可以说docker build . myApp --build-arg VERSION=9
为此应用程序构建docker镜像的过程是相同的。我不想让几乎相同的Dockerfiles使用不同的基本图像。如果我想构建版本9,它应该使用基本图像的版本9。
答案 0 :(得分:12)
引用this link :
如果有人来这里寻找答案,这现在是可能的:https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
答案 1 :(得分:3)
至少对于此docker版本,这是可行的
docker --version
docker version 18.09.8, build bfed4f5
它需要Dockerfile中的预设变量,例如
ARG TAG=latest
FROM traefik:${TAG}
然后您可以使用以下内容覆盖此预设
docker build --build-arg "TAG=2.2.8" -t my-app:$TAG
版本号在构建期间不会显示。如果要测试它是否有效,请引用不存在的版本-它将失败,并显示:manifest my-app:version not found。
答案 2 :(得分:2)
您只需从模板生成Dockerfile即可。放 在Makefile中这样的东西:
MYTAG=latest
.PHONY: Dockerfile
Dockerfile: Dockerfile.in
sed 's/MYTAG/$(MYTAG)/' $< > $@ || rm -f $@
然后你可以运行:
make MYTAG=8; docker build -t my-app-8 .
如果您经常构建图像,这只会有意义
需要FROM
行中的其他标记。
答案 3 :(得分:1)
这是不可能的。
尽管如此,您可以使用from myApp:latest
之类的变量标记,并在创建新版本时覆盖latest
标记。
答案 4 :(得分:1)
使用buildah以编程方式构建容器(也可以使用Dockerfile)。
所以对于你的用例:
VERSION=v0.1.0
myCon=$(buildah from myApp:${VERSION})
buildah config --cmd "sleep 1d" $myCon
buildah commit $myCon $USER/sleeping1d
你可以显然编写脚本,保存并调用它,还有一个优点 buildah不需要运行docker守护程序,这对CI很有用。它也是一个开源项目,请查看项目页面。
BTW我最近看到了这个问题,这正是你想要的 - https://github.com/projectatomic/buildah/issues/581
答案 5 :(得分:0)
不幸的是,这是不可能的。 Dockerfile 的第一行必须是FROM
指令,因此不能使用ARG
指令。关于生成Dockerfile,larsks有一个很好的答案,但是我也想建议只创建不同的Dockerfiles,然后使用docker build
开关在-f
命令中指定一个特定的Dockerfiles:
docker build -t codemiester/app:latest -f ./Dockerfile.apache2.ubuntu