Dockerfile:有没有办法从 .env 文件中读取变量
Posted
技术标签:
【中文标题】Dockerfile:有没有办法从 .env 文件中读取变量【英文标题】:Dockerfile: Is there any way to read variables from .env file 【发布时间】:2020-08-24 21:00:08 【问题描述】:我想读取 Dockerfile 中的 PORT
变量,该变量在 .env
文件中定义。
有没有办法做到这一点?
这是我的 Dockerfile:
FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ENV PORT=3000
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "run", "start"]
【问题讨论】:
你可以在docker文件中包含env文件...或者你可以在使用docker-run时传入环境变量 ***.com/questions/30494050/… ***.com/questions/46917831/… 【参考方案1】:您可以在 Dockerfile 中使用 ARG 来实现此目的。
【讨论】:
【参考方案2】:更新
经过聊天讨论发现nodejs应用容器没有问题,问题来自于配置错误的nginx代理。
工作 nodejs 应用程序的证明是下一个 docker-compose 文件。
version: "3"
services:
api:
build: .
curl:
image: curlimages/curl:7.70.0
depends_on:
- api
entrypoint: ""
command: curl -si --retry 5 --retry-delay 5 --retry-max-time 40 http://api:6000
restart: on-failure
原创
如果您想在构建过程中更改端口(稍后运行容器时它将是静态的),请使用 build-args
docker build --build-arg APP_PORT=3000
FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ARG APP_PORT=80
EXPOSE $APP_PORT
COPY . .
RUN APP_PORT=$APP_PORT npm install
CMD APP_PORT=$APP_PORT npm run start
如果您希望在启动容器时能够更改端口 - 那么 build-args 不适合,您需要使用 env
变量。请注意,构建后EXPOSE
无法更改。
无论如何,如果您在 EXPOSE
中有不同的端口并且您的应用程序会监听 - 它不会破坏任何东西,那么应用程序的端口将在您想要的端口上可用,尽管它没有在 EXPOSE
中指定。
您甚至可以跳过文件中的EXPOSE
,因为它更多的是图像的元数据信息,而不是系统打开端口的指令:https://docs.docker.com/engine/reference/builder/#expose
无论 EXPOSE 设置如何,您都可以在运行时使用 -p 标志覆盖它们。
如果您的图像在构建后是静态的(您不打算更改 .env),您可以下一步进行操作,那么 npm install
和 npm run start
具有相同的 env。并且您仍然可以稍后更改端口,但不会影响 npm install。
FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN export $(cat .env) && npm install
CMD export $(cat .env) && npm run start
如果您必须将 CMD
保留为数组 - 那么我们需要创建一个引导脚本
FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN export $(cat .env) && npm install
RUN echo '#!/usr/bin/env sh' > start.sh && echo 'export $(cat .env) && npm run start $@' >> start.sh
CMD ["sh", "./start.sh"]
【讨论】:
在我的快速应用程序中,我正在从 .env 文件中读取 PORT 值我正在运行这样的程序dotenv -e .env yarn start
所以,端口是从 env 文件中获取的。但是,是否有可能在 dockerFile 中获得相同的 PORT 值?否则,如果 APP_PORT 与 .env 文件端口不同,应用程序将无法正常运行。
不确定它是否是最好的解决方案,至少它有效:) export $(cat .env)
是诀窍,但它应该在每个命令之前执行,因为在 RUN
之后它们就消失了。
应该在哪个文件中添加export $(cat .env)
?
检查我的答案 - Dockerfile
的最新选项,这应该可以解决问题。 CMD export $(cat .env) && npm run start
不幸的是,它不起作用,这是我的 dockerFIle 和 docker-compose 文件,以防您需要 gist.github.com/ashiqdev/b13da5ee9f0392277d38a5786de82f27 我在控制台中收到“服务器正在侦听端口 6000”。但实际上它并没有在听。以上是关于Dockerfile:有没有办法从 .env 文件中读取变量的主要内容,如果未能解决你的问题,请参考以下文章
Docker 从入门到实践系列五 - Dockerfile文件
Docker 从入门到实践系列五 - Dockerfile文件