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 参数实现构建模板相关推荐
- Dockerfile 之 ARG指令详解及示例
参考教程:https://docs.docker.com/engine/reference/builder/ 环境 virtual box 6.1 centos 7.8 docker 19.03 AR ...
- Dockerfile实践之多阶段构建
在Docker 17.05之后,Docker在构建中支持了多阶段构建,简单来说,Dockerfile中可以有多个FROM,这篇文章通过一个简单的示例来说明多阶段构建的使用场景和方式. 目录 基本语法 ...
- Dockerfile 文件结构、docker镜像构建过程详细介绍
[Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...
- dockerfile以alpine为基础镜像构建nginx镜像
dockerfile以alpine为基础镜像构建nginx镜像 文章目录 dockerfile以alpine为基础镜像构建nginx镜像 1:alpine 2:alpine软件包管理命令 apk ad ...
- 再见 Dockerfile,拥抱新型镜像构建技术 Buildpacks
作者:米开朗基杨,方阗 云原生正在吞并软件世界,容器改变了传统的应用开发模式,如今研发人员不仅要构建应用,还要使用 Dockerfile 来完成应用的容器化,将应用及其依赖关系打包,从而获得更可靠的产 ...
- 控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序
前言 在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动.具体在 [管理过程](https://12factor. ...
- Docker系列之八:在Dockerfile中使用多段构建Muti-stage build
系列链接 Docker系列之一:Docker介绍及在Ubuntu上安装 Docker系列之二:Docker 入门 Docker系列之三:使用Docker镜像和仓库 Docker系列之四:Dockerf ...
- 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码
专栏:区块链技术开发 目录 1.介绍Truffle Box 2.Truffle Box功能方法 3.Truffle Box模板案例 truffle Box预构建模板的示例代码 运行构建模板的示例代码 ...
- C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...
最新文章
- http2.0的时代来了
- Github在windows7环境下使用入门
- 剑指Offer 31 栈的压入、弹出序列
- 前端路由的原生代码实现?前端如何监听路由变化?
- php中计算时间差的几种方法,php计算时间差的方法
- (六)将样式转换模型从TensorFlow转换为TensorFlow Lite
- php tp5.3,[李景山php]每天TP5-20161226|thinkphp5-Console.php-3
- imx6 android power off
- C#多线程池演示例程--下载图片
- SJIS_DBC_TO_SBC小例子
- LENET-5卷积神经网络的深度学习技术
- springboot 实现自动屏蔽敏感词过滤器
- 网页前端简单计算器制作
- 按要求写mysql语句_根据要求写SQL 语句
- UWP 动画系列之模仿网易云音乐动画
- java bean 首字母大写_javaBean命名规范 get / set 后的首字母大写
- python调研报告总结体会_调查报告的心得体会
- 解决xp共享的批处理文件
- 获取地址段的所有地址(二)
- 纽约州立大学水牛城分校计算机科学专业,纽约州立大学水牛城分校有哪些强势专业...