在 docker 构建期间访问 ENV VARS

问题描述 投票:0回答:1

我一直在寻找一个合适的解决方案,可以在我的 docker 构建中访问环境变量。我知道我可以传递 buildArgs,但这意味着我必须提供 ENV VAR 作为构建参数,这在我们的情况下不是一个选项。

您可以在下面找到我的 docker compose 文件的片段(本文特意删除了一些卷安装):


services:
  client-dev:
    build:
      dockerfile: dev.Dockerfile
      args:
        - ENV_FILE=.env
    ports:
      - '5173:5173'

这是我的 dev.Dockerfile:

FROM node:18

ARG ENV_FILE
COPY $ENV_FILE .env

# Load environment variables from .env using a shell command
RUN export $(cat .env | xargs)
RUN npm config set "@fortawesome:registry" https://npm.fontawesome.com/
RUN npm config set "//npm.fontawesome.com/:_authToken" $FONTAWESOME_NPM_AUTH_TOKEN

WORKDIR /app
COPY package.json /app/package.json

EXPOSE 5173

RUN npm i

CMD ["npm", "run", "dev"]

如您所见,我试图通过加载 .env 文件并在 shell 命令中导出它们来在我的 docker 构建中实现 ENV VAR 的使用。然而,被调用的

$FONTAWESOME_NPM_AUTH_TOKEN
var 似乎仍然是空的。由于不可能提供 .env 文件作为 docker 构建的一部分,我想知道是否有更好的方法来解决这个问题。

docker npm docker-compose font-awesome
1个回答
0
投票

您面临的问题与以下事实有关:在构建过程中使用

export
设置的环境变量在 Docker 镜像的后续层中并不持久可用。因此,当您尝试在 Dockerfile 的后面部分中使用
$FONTAWESOME_NPM_AUTH_TOKEN
时,它不会保留在较早层中设置的值。

要在 Dockerfile 中的构建过程中处理环境变量,您可以使用

ARG
指令来处理构建时变量,使用 ENV 指令来处理正在运行的容器中可用的环境变量。但是,请注意,在运行的容器中无法访问构建时变量。

这是 Dockerfile 的修改版本,它使用 ARG 作为构建时变量:


FROM node:18

ARG ENV_FILE
ARG FONTAWESOME_NPM_AUTH_TOKEN

COPY $ENV_FILE .env

# Load environment variables from .env using a shell command
RUN export $(cat .env | xargs) && \
    npm config set "@fortawesome:registry" https://npm.fontawesome.com/ && \
    npm config set "//npm.fontawesome.com/:_authToken" $FONTAWESOME_NPM_AUTH_TOKEN

WORKDIR /app
COPY package.json /app/package.json

EXPOSE 5173

RUN npm i

CMD ["npm", "run", "dev"]

您的原始 Dockerfile 尝试在构建过程中使用导出来设置环境变量。然而,这种方法的问题是,使用导出设置的环境变量在 Docker 映像的后续层中并不持久可用。在构建过程中设置的环境变量仅在该特定构建步骤中可用,并且不会延续到后续步骤。

在我提供的修改后的 Dockerfile 中,我使用

ARG
指令表示构建时变量,使用
ENV
表示运行容器中可用的环境变量。这允许您在构建过程中传递构建时参数并在特定构建中使用它们。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.