首页 > 解决方案 > 如何使 Dockerfile 上的所有环境变量可用?

问题描述

我有这个 Dockerfile

FROM node:14.17.1
ARG GITHUB_TOKEN
ARG REACT_APP_BASE_URL
ARG DATABASE_URL
ARG BASE_URL
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
ENV GITHUB_TOKEN=${GITHUB_TOKEN}
ENV REACT_APP_BASE_URL=${REACT_APP_BASE_URL}
ENV DATABASE_URL=${DATABASE_URL}
ENV BASE_URL=${BASE_URL}
ENV PORT 80
COPY . /usr/src/app
RUN npm install
RUN npm run build
EXPOSE 80
CMD ["npm", "start"]

但我不喜欢设置每个环境变量。是否可以让所有这些都可用而无需一一设置?

标签: dockerdockerfile

解决方案


在继续之前,我们需要注意以下两项:

  • 正如@Lukman 在评论中提到的那样,TOKEN除非您完全供内部使用,否则不是存储在图像中的好项目,您决定。
  • 即使我们没有在 中一一指定环境Dockerfile,我们仍然需要在其他地方定义它们,因为程序本身无法知道您真正需要什么环境。

如果以上都没有问题,那就继续吧。基本上,我认为在脚本中定义环境(在这里,使用ENV1ENV2例如),然后source在容器中定义它们,并让app访问这些变量的方法是您所需要的。

环境.sh:

export ENV1=1
export ENV2=2

应用程序.js:

#!/usr/bin/env node

var env1 = process.env.ENV1;
var env2 = process.env.ENV2;
console.log(env1);
console.log(env2);

入口点.sh:

#!/bin/bash
source /usr/src/app/env.sh
exec node /usr/src/app/app.js

Dockerfile:

FROM node:14.17.1
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN chmod -R 755 /usr/src/app
CMD ["/usr/src/app/entrypoint.sh"]

执行:

$ docker build -t abc:1 .
$ docker run --rm abc:1
1
2

解释:

我们在 Dockerfile 中更改CMD或使用自定义,在此,我们将首先 source哪些 make对子进程可见。ENTRYPOINTentrypoint.shentrypoint.shenv.shENV1ENV2entrypoint.sh

然后,我们exec将当前进程替换为node app.js,soPID1变为node app.js现在,同时app.js仍然可以得到 中定义的环境env.sh

有了上面,我们不需要Dockerfile一个一个地定义变量,但我们的应用程序仍然可以获取环境。


推荐阅读