我想读取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/#exposeRegardless of the EXPOSE settings, you can override them at runtime by using the -p flag.
如果构建后图像是静态的(您不打算更改.env),则可以下一步操作,然后
npm install
和npm 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/