我可以在Dockerfile FROM语句中引用环境变量吗?

时间:2019-10-02 07:02:30

标签: docker docker-registry docker-registry-mirror

我想做的是这样

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine
# more stuff

但是,这需要在没有Internet访问权限的隔离的干净构建机器上运行,因此我需要通过本地镜像服务器(例如Artifactory或Nexus或其他类似的东西)路由它

如果docker映像托管在docker hub上(例如FROM ubuntu),那么--registry-mirrors docker配置选项将为我们解决该问题。
但是,因为微软已决定不使用docker hub,因此注册表镜像也无法正常工作。

经过大量的努力,我为mcr.microsoft.com设置了一个自定义域镜像,因此现在我可以这样做:

FROM microsoft-docker-mirror.local.domain/dotnet/core/aspnet:3.0-alpine
# more stuff

那行得通。但是我们有一些远程工作人员,他们可能不在本地办公室LAN上,并且看不到我的本地镜像服务器。我现在想做的是根据环境而定。例如

ENV MICROSOFT_DOCKER_REPO mcr.microsoft.com
FROM ${MICROSOFT_DOCKER_REPO}/dotnet/core/aspnet:3.0-alpine

我隔离的构建机器将设置MICROSOFT_DOCKER_REPO环境变量,其他所有人的计算机将使用默认的mcr.microsoft.com

无论如何。将ENV行添加到dockerfile会导致docker抛出以下错误:

Error response from daemon: No build stage in current context

似乎有很多引用表明FROM行必须是文件中的第一行,甚至没有任何注释... 如何在FROM语句中引用环境变量?或者,如何使注册表镜像适用于非docker hub的事物?

谢谢!

1 个答案:

答案 0 :(得分:2)

ARGFROM”-Dockerfile referenceDockerfile之前唯一的指令。

ARG MICROSOFT_DOCKER_REPO=mcr.microsoft.com
FROM ${MICROSOFT_DOCKER_REPO}/dotnet/core/aspnet:3.0-alpine

使用MICROSOFT_DOCKER_REPO--build-arg

使用非默认docker build --rm --build-arg MICROSOFT_DOCKER_REPO=repo.example.com -t so:58196638 .构建

注意:您可以从主机环境中传递--build-arg,即MICROSOFT_DOCKER_REPO=repo.example.com docker build --rm --build-arg MICROSOFT_DOCKER_REPO=${MICROSOFT_DOCKER_REPO} -t so:58196638 .