容器是交付软件的最佳方式,因为您要交付具有所需依赖项的整个系统。
但是,当您想为特定目的构建这些图像时,构建这些图像可能会很麻烦。
在构建 Image 时可能需要一些动态值,以便在构建时生成最优化的包; 不是在执行它们时。
但是,没有办法将环境变量传递给 docker build,类似于我们执行这些图像的方式:
# build the image with the tag 'msql'
docker build -e NODE_ENV=production -t msql .# let's run the image with the above-built tag
docker run -d msql -e NODE_ENV=production
在上面的例子中,构建命令中的 -e 没有任何作用,只会假设未赋值/默认值的情况; 反而跑
那么我们如何将动态值传递给 docker build 命令呢?
ARG 和 ENV
Dockerfile 的 ARG 和 ENV 关键字可以帮助您。
但是正如我们上面所讨论的,ENV 对外部没有影响,那么我们为什么要使用它呢? 向下游传播通过 ARG 关键字获得的值。
ARG 关键字如何工作? 让我们看一个示例 Dockerfile:
FROM alpine:3.14
RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.14/main/ \
nodejs-current \
bash \
npmARG PORT
ENV PORT ${PORT:-3000}WORKDIR appCOPY . .RUN npm ci --prodENTRYPOINT [ "node", "index.js" ]
在上面的 Dockerfile 中,我们使用的是 ARG PORT。 这意味着我们允许构建命令接受 PORT 参数
我们可以执行以下命令在构建时传递默认端口:
docker build --build-args PORT=5000 -t mynode-app .
要记住的一件大事是 ARG 名称区分大小写,因此应谨慎使用。
但是,由于它们区分大小写,它们可用于从执行构建命令的环境中选择值。
例如,我们可以将 PORT 定义为环境变量。 现在,我们不需要从环境中获取值,它是由 Docker 自动映射的。
export PORT=50001
echo $PORT
# 50001
docker build --build-args PORT -t mynode-app .
这就是我们如何使用 ARG 和 ENV 自定义构建的方式?
对于大多数应用程序,您可能不需要对构建映像进行如此多的自定义。
但是在您使用大量自动化的地方,这种定制方式变得非常有用。
结论
- 使用 ARG 定义可传递的值
- 使用 ENV 将 ARG 值传播到应用程序代码
- 使用 --build-args 标志在 docker 构建中传递定义的 ARG
- --build-arg 可以将ARG名称映射到环境变量
如果您觉得本文对您有帮助,请与他人分享