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 参数实现构建模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArrayPool 源码解读之 byte
- 下一篇: 你好,同学!在云端学习最潮的技术吧!