npm Docker构建过程中的CNOENV VARS

yi0zb3m4  于 5个月前  发布在  Docker
关注(0)|答案(1)|浏览(61)

我一直在寻找一个合适的解决方案,在那里我可以在我的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文件,我想知道是否有更好的方法来实现这一点。

aor9mmx1

aor9mmx11#

您面临的问题与以下事实有关:在构建过程中使用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指令。这允许您在构建过程中传递构建时参数,并在特定构建中使用它们。
希望有帮助!

相关问题