我一直在寻找一个合适的解决方案,可以在我的 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 构建的一部分,我想知道是否有更好的方法来解决这个问题。
您面临的问题与以下事实有关:在构建过程中使用
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
表示运行容器中可用的环境变量。这允许您在构建过程中传递构建时参数并在特定构建中使用它们。
希望有帮助!