Dockerfile 使用 ARG 参数实现构建模板

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile 使用 ARG 参数实现构建模板相关的知识,希望对你有一定的参考价值。

Dockerfile 使用 ARG 参数实现构建模板

Intro

Dockerfile 里用来表示变量的主要有两个东西,一个是 ENV 代表了环境变量,另外一个则是 ARG 代表是构建 docker 镜像时的一个构建参数,需要在执行 docker build 命令时指定变量的值,最近使用了 ARG 来表示在 Dockerfile 里安装 dotnet global tool 的版本

Sample

来看一个使用示例,下面是一个 Dockerfile 示例

FROM mcr.microsoft.com/dotnet/runtime:6.0-alpine AS base
LABEL Maintainer="WeihanLi"

FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build-env
# dotnet-httpie version, docker build --build-arg TOOL_VERSION=0.1.0 -t weihanli/dotnet-httpie:0.1.0 .
ARG TOOL_VERSION
RUN dotnet tool install --global dotnet-httpie --version ${TOOL_VERSION}

FROM base AS final
COPY --from=build-env /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="/root/.dotnet/tools:${PATH}"

在上面的 Dockerfile 中我们声明了一个 TOOL_VERSION 的参数,需要在 docker build 的时候通过 build-arg 来指定这个参数,如果不指定会报错,因为我们并没有指定默认值,你也可以在声明的时候指定一个默认值 ARG TOOL_VERSION=1.0.0

实际 build docker 镜像时使用下面的命令:

docker build --build-arg TOOL_VERSION=0.1.0 -t weihanli/dotnet-httpie:0.1.0 .

docker build --build-arg TOOL_VERSION=0.1.1-preview-20210829-075835 -t weihanli/dotnet-httpie:0.1.1-preview-20210829-075835 .

可以看到实际安装的 dotnet tool 版本就是 build 的时候指定的版本

More

很多人可能会想要问什么时候用 ARG 什么时候用 ENV 呢,刚好看到 StackOverflow 上的一个回答,可以参考:https://stackoverflow.com/questions/41916386/arg-or-env-which-one-to-use-in-this-case

如果你想在构建镜像时自定义,那你应该考虑使用 ARG,因为 ARG 是构建时的参数,而 ENV 则是最终运行时容器的一个变量,你可以在 docker run 创建容器的时候指定环境变量的时,两个参数属于不同的阶段,具体要看自己的需求了,根据需要灵活选择

大名鼎鼎的 v2ray 在构建 docker 镜像的时候也是选择了使用 ARG 来动态地在构建镜像时参数化,可以参考文末 v2ray 的链接

ARG 还有一些内置的参数,有需要可以参考文末 docker 的文档

References

  • https://docs.docker.com/engine/reference/builder/#arg

  • https://github.com/WeihanLi/dotnet-httpie/blob/dev/Dockerfile

  • https://github.com/v2fly/docker/blob/master/Dockerfile

  • https://github.com/v2fly/docker/blob/master/.github/workflows/docker-push.yml

以上是关于Dockerfile 使用 ARG 参数实现构建模板的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfiles ENV和ARG的应用

Dockerfiles ENV和ARG的应用

ARG 构建参数----Dockerfle文件的重用

云原生 | Docker篇深入Dockerfile

在 Dockerfile CMD 中使用 docker ARG

docker 实践六:dockerfile 详解