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 installnpm 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文件

Docker 从入门到实践系列五 - Dockerfile文件

Dockerfiles ENV和ARG的应用

Dockerfiles ENV和ARG的应用

可以将来自docker-compose.yml的env变量传递给dockerfile吗?