docker - 如何使 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"]
但我不喜欢设置每个环境变量。是否可以让所有这些都可用而无需一一设置?
解决方案
在继续之前,我们需要注意以下两项:
- 正如@Lukman 在评论中提到的那样,
TOKEN
除非您完全供内部使用,否则不是存储在图像中的好项目,您决定。 - 即使我们没有在 中一一指定环境
Dockerfile
,我们仍然需要在其他地方定义它们,因为程序本身无法知道您真正需要什么环境。
如果以上都没有问题,那就继续吧。基本上,我认为在脚本中定义环境(在这里,使用ENV1
,ENV2
例如),然后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对子进程可见。ENTRYPOINT
entrypoint.sh
entrypoint.sh
env.sh
ENV1
ENV2
entrypoint.sh
然后,我们exec
将当前进程替换为node app.js
,soPID1
变为node app.js
现在,同时app.js
仍然可以得到 中定义的环境env.sh
。
有了上面,我们不需要Dockerfile
一个一个地定义变量,但我们的应用程序仍然可以获取环境。
推荐阅读
- android - 带有 ExoPlayer 的 RecyclerView 是滞后的
- php - 如何在学说/php中的实体属性中聚合来自不同表的信息?
- docker - 如何在 Docker Compose 中启动 Apache Drill
- c++ - 无法从本地 Windows 调试器切换到本地机器(VS 2019)
- swiftui - 如何在 SwiftUI 中添加编号/项目符号列表?
- assembly - 如何使用 BIOS INT 0x15, AX=0x5307(关闭计算机)?
- java - 多个 ThreadPoolExecutor 并行
- php - 两个表的 php WITH ROLLUP
- linux - 如何使用 NASM 编写函数以显示汇编语言中的字符?
- python - 检查 Django FileField 中的文件扩展名