Ash*_*hik 10 environment-variables docker dockerfile docker-compose
我想读取文件中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"]
Run Code Online (Sandbox Code Playgroud)
更新
在聊天中讨论后意识到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
Run Code Online (Sandbox Code Playgroud)
原来的
如果您想在构建过程中更改端口(稍后运行容器时它将是静态的),请使用 build-args
docker build --build-arg APP_PORT=3000
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果您希望能够在启动容器时更改端口 - 那么 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
Run Code Online (Sandbox Code Playgroud)
如果您必须保留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"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6620 次 |
| 最近记录: |