如何在Dockerfile中无需逐个声明即可使用所有环境变量
解决方案
完全可以不用逐个声明配置,常用的有两种落地方式:
方式1:构建时批量传参,适合不需要把环境变量固化到镜像里的场景
Docker的构建过程本身支持批量读取参数,不需要在Dockerfile里逐个写ARG和ENV:
- 如果你要传的变量已经在当前shell环境里存在,直接用下面的命令构建即可,所有变量在构建阶段的
RUN指令里都可以直接读取:
docker build $(env | grep -E '^(GITHUB_TOKEN|REACT_APP_|DATABASE_URL|BASE_URL)' | sed 's/^/--build-arg /') .
- 如果你习惯用
.env文件存变量,先把所有变量写到项目根目录的.env中,再用下面的命令批量读取传参:
docker build $(cat .env | grep -v '^#' | sed 's/^/--build-arg /') .
方式2:固化变量到镜像中,适合需要镜像运行时也能读取变量的场景
如果你需要这些环境变量在镜像运行时也生效,不想逐个写ENV指令,可以修改Dockerfile,增加一步变量导入操作:
FROM node:14.17.1 RUN mkdir /usr/src/app WORKDIR /usr/src/app ENV PATH /usr/src/app/node_modules/.bin:$PATH ENV PORT 80 # 把本地.env文件复制到镜像中 COPY .env /usr/src/app/.env COPY . /usr/src/app # 批量把.env里的变量导出到系统环境变量,构建和运行时都生效 RUN cat .env | grep -v '^#' >> /etc/environment RUN npm install RUN npm run build EXPOSE 80 CMD ["npm", "start"]
注意:如果你的.env里包含敏感信息(比如GITHUB_TOKEN),不要用这种方式,避免敏感信息固化到镜像里造成泄漏。
小提示:如果你的变量都是
REACT_APP_开头的React构建时变量,其实不需要保留到运行时,用方式1传递即可,构建完成后变量已经打进了静态资源里,镜像运行时不需要这些变量。
内容的提问来源于stack exchange,提问作者italodeandra
相关产品推荐
相关产品推荐

