我一直在寻找一个合适的解决方案,在那里我可以在我的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似乎仍然是空的。由于不可能在Docker构建中提供.env文件,我想知道是否有更好的方法来实现这一点。
1条答案
按热度按时间aor9mmx11#
您面临的问题与以下事实有关:在构建过程中使用
export
设置的环境变量在Docker镜像的后续层中不可持续使用。因此,当您尝试在Dockerfile的后面部分使用$FONTAWESOME_NPM_AUTH_TOKEN
时,它不会保留在前面层中设置的值。要在Dockerfile中的构建过程中处理环境变量,您可以使用
ARG
指令处理构建时变量,使用ENV指令处理运行容器中可用的环境变量。但是,请注意,构建时变量在运行容器中不可访问。下面是Dockerfile的修改版本,它使用ARG作为构建时变量:
字符串
您的原始Dockerfile尝试在构建过程中使用导出来设置环境变量。然而,这种方法的问题是,使用导出设置的环境变量在Docker镜像的后续层中不可持续使用。在构建过程中设置的环境变量仅在特定构建步骤中可用,不会延续到后续步骤。
在我提供的修改后的Dockerfile中,我对构建时变量使用了
ARG
指令,对运行容器中可用的环境变量使用了ENV
指令。这允许您在构建过程中传递构建时参数,并在特定构建中使用它们。希望有帮助!