可以在docker FROM中使用变量吗?

时间:2016-04-11 18:44:53

标签: docker

我想知道是否可以在docker中使用env变量?原因是控制标记。例如,假设我在Dockerfile中有这一行:

From myApp

我想要的是:

From myApp:${VERSION}

这样我可以说docker build . myApp --build-arg VERSION=9

为此应用程序构建docker镜像的过程是相同的。我不想让几乎相同的Dockerfiles使用不同的基本图像。如果我想构建版本9,它应该使用基本图像的版本9。

6 个答案:

答案 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