专业编程基础技术教程

网站首页 > 基础教程 正文

七爪源码:动态配置 Docker Image 构建

ccvgpt 2024-07-30 20:56:17 基础教程 15 ℃

容器是交付软件的最佳方式,因为您要交付具有所需依赖项的整个系统。

但是,当您想为特定目的构建这些图像时,构建这些图像可能会很麻烦。

七爪源码:动态配置 Docker Image 构建

在构建 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名称映射到环境变量

如果您觉得本文对您有帮助,请与他人分享

Tags:

最近发表
标签列表