更新
经过聊天讨论发现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 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
如果您必须将 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"]