【问题标题】:Dockerfile: Is there any way to read variables from .env fileDockerfile:有没有办法从 .env 文件中读取变量
【发布时间】: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 docker-compose environment-variables dockerfile


【解决方案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”。但实际上它并没有在听。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2017-10-26
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多