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

Can I reference an environment variable in a Dockerfile FROM statement?

我想做的是:

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

但是,这需要 运行 在没有互联网访问权限的独立干净构建机器上,所以我需要通过本地镜像服务器(例如 Artifactory 或 Nexus 或其他类似的东西)

如果 docker 图像托管在 docker 集线器上(例如 FROM ubuntu),那么 --registry-mirrors docker 配置选项将为我们解决它。
但是因为微软决定不使用 docker 集线器,所以注册表镜像也不起作用。

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

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

行得通。但是我们有远程工作者,他们可能不在本地办公室局域网上,看不到我的本地镜像服务器。我现在想做的是根据环境改变它。例如

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

我的独立构建机器将设置 MICROSOFT_DOCKER_REPO 环境变量,其他人的机器将使用默认值 mcr.microsoft.com

无论如何。将 ENV 行添加到 docker 文件会导致 docker 抛出此错误:

Error response from daemon: No build stage in current context

似乎有很多人提到 FROM 行 必须 是文件中的第一行,甚至在任何注释之前...... 如何在 FROM 语句中引用环境变量?或者,我怎样才能使注册表镜像适用于非 docker 中心的东西?

谢谢!

"ARGDockerfileFROM 之前的唯一指令" - Dockerfile reference.

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

使用 --build-arg 使用非默认值 MICROSOFT_DOCKER_REPO 构建: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 .