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 参数实现构建模板相关推荐

  1. Dockerfile 之 ARG指令详解及示例

    参考教程:https://docs.docker.com/engine/reference/builder/ 环境 virtual box 6.1 centos 7.8 docker 19.03 AR ...

  2. Dockerfile实践之多阶段构建

    在Docker 17.05之后,Docker在构建中支持了多阶段构建,简单来说,Dockerfile中可以有多个FROM,这篇文章通过一个简单的示例来说明多阶段构建的使用场景和方式. 目录 基本语法 ...

  3. Dockerfile 文件结构、docker镜像构建过程详细介绍

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  4. dockerfile以alpine为基础镜像构建nginx镜像

    dockerfile以alpine为基础镜像构建nginx镜像 文章目录 dockerfile以alpine为基础镜像构建nginx镜像 1:alpine 2:alpine软件包管理命令 apk ad ...

  5. 再见 Dockerfile,拥抱新型镜像构建技术 Buildpacks

    作者:米开朗基杨,方阗 云原生正在吞并软件世界,容器改变了传统的应用开发模式,如今研发人员不仅要构建应用,还要使用 Dockerfile 来完成应用的容器化,将应用及其依赖关系打包,从而获得更可靠的产 ...

  6. 控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序

    前言 在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动.具体在 [管理过程](https://12factor. ...

  7. Docker系列之八:在Dockerfile中使用多段构建Muti-stage build

    系列链接 Docker系列之一:Docker介绍及在Ubuntu上安装 Docker系列之二:Docker 入门 Docker系列之三:使用Docker镜像和仓库 Docker系列之四:Dockerf ...

  8. 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码

    专栏:区块链技术开发 目录 1.介绍Truffle Box 2.Truffle Box功能方法 3.Truffle Box模板案例 truffle Box预构建模板的示例代码 运行构建模板的示例代码 ...

  9. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

最新文章

  1. http2.0的时代来了
  2. Github在windows7环境下使用入门
  3. 剑指Offer 31 栈的压入、弹出序列
  4. 前端路由的原生代码实现?前端如何监听路由变化?
  5. php中计算时间差的几种方法,php计算时间差的方法
  6. (六)将样式转换模型从TensorFlow转换为TensorFlow Lite
  7. php tp5.3,[李景山php]每天TP5-20161226|thinkphp5-Console.php-3
  8. imx6 android power off
  9. C#多线程池演示例程--下载图片
  10. SJIS_DBC_TO_SBC小例子
  11. LENET-5卷积神经网络的深度学习技术
  12. springboot 实现自动屏蔽敏感词过滤器
  13. 网页前端简单计算器制作
  14. 按要求写mysql语句_根据要求写SQL 语句
  15. UWP 动画系列之模仿网易云音乐动画
  16. java bean 首字母大写_javaBean命名规范 get / set 后的首字母大写
  17. python调研报告总结体会_调查报告的心得体会
  18. 解决xp共享的批处理文件
  19. 获取地址段的所有地址(二)
  20. 纽约州立大学水牛城分校计算机科学专业,纽约州立大学水牛城分校有哪些强势专业...

热门文章

  1. 分析纯文本外链在SEO优化方面的作用
  2. .NET Regular Expressions
  3. 2021年江苏高考各科成绩查询,江苏2021年高考总分及各科分数
  4. python 退出程序_Python:用Ctrl+C解决终止多线程程序的问题!(建议收藏)
  5. 利用解构赋值获取后端特定字段数据
  6. PAT-乙级-1042 字符统计
  7. WPF初学——自定义样式
  8. 扩展Windows Mobile模拟器存储空间的方法
  9. 经典正则表达式(转)
  10. Mac OS使用技巧十九:Safari碉堡功能之二查看网页源码