docker - Dockerfile:有什么方法可以从.env文件读取变量

标签 docker docker-compose environment-variables dockerfile

我想读取PORT文件中定义的Dockerfile中的.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"]

最佳答案

更新了

在聊天中讨论后,人们意识到nodejs应用程序容器没有问题,并且问题来自配置错误的nginx代理。

下一个docker-compose文件是可运行的nodejs应用程序的证明。

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

Regardless of the EXPOSE settings, you can override them at runtime by using the -p flag.



如果构建后图像是静态的(您不打算更改.env),则可以下一步操作,然后npm installnpm run start具有相同的env。而且您仍然可以稍后更改端口,但这不会影响npm安装。
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"]

关于docker - Dockerfile:有什么方法可以从.env文件读取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61693804/

相关文章:

Docker 搜索找不到图像,但 docker pull 可以

Docker 持久卷没有权限 (Apache Solr)

docker - docker-compose的RabbitMQ无法还原数据

docker - 找不到Traefik和Nginx 404页面

vim - 使用 gvim 在内部修改 PATH?

python - 是否可以从正在运行的 Docker 容器中发送 HTTP 请求

windows - Windows 上的 Docker - 端口已锁定

selenium - 使用 Pytest 、 Selenium Grid 和 Docker 创建测试基础设施

powershell - GitHub 操作 : Pass Environment Variable to into Action using PowerShell

django - 如何从 Apache 读取环境变量从 Django 1.6.5 更新到 1.7