【问题标题】:Docker run exit wit code 0 - Node.js & PostgresDocker 运行以代码 0 退出 - Node.js 和 Postgres
【发布时间】:2021-10-17 02:25:48
【问题描述】:

我用 Postgres 数据库构建了一个小型 Node.js 应用程序。我想对它进行 Dockerize 化,当我使用 docker-compose 时一切正常,现在我试图将它放在 AWS EC2 上,我正在使用 docker run,但它不起作用。

Docker 运行命令: docker run -d -p 80:4000 --name appname hubname/appname 容器立即启动和停止

我对 Docker 还很陌生,所以我想我错过了一些东西。

请找到我的 Dockerfile:

FROM node:14 as base
WORKDIR /home/node/app
COPY package*.json ./
RUN npm install
COPY . .
FROM base as production
ENV NODE_PATH=./build
RUN npm start

我的 docker-compose:

version: '3.7'

services:
    appname-db:
        image: postgres
        container_name: appname-db
        environment:
            POSTGRES_USER: ${POSTGRES_USER}
            POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        ports: 
            - '5432:5432'
        volumes:
            - appname-db:/var/lib/postgresql/data
    ts-node-docker:
        build:
            context: .
            dockerfile: Dockerfile
            target: production
        volumes:
            - ./src:/home/node/app/src
            - ./nodemon.json:/home/node/app/nodemon.json
        container_name: ts-node-docker
        environment:
            DB_HOST: ${DB_HOST}
            DB_SCHEMA: ${DB_SCHEMA}
            DB_USER: ${DB_USER}
            DB_PASSWORD: ${DB_PASSWORD}
        depends_on:
            - appname-db:
                condition: service_healthy
        expose:
            - '4000'
        ports:
            - '80:4000'
        stdin_open: true
        command: npm run start
volumes:
    appname-db:

当我这样做时: docker ps -a我看到容器启动并立即退出。

我找不到任何日志,这非常令人沮丧。

任何帮助/指针将不胜感激。

编辑 1 - 一些附加信息:

当我使用 docker-compose 时,我们可以看到 2 个容器:

然而,这就是我使用 docker run 所拥有的:

【问题讨论】:

  • 我认为您必须将构建工件从构建的第一阶段(在第二条 FROM 指令之前)复制到构建的第二阶段。例如,这是使用 ``COPY --from=0 /home/node/app/build ./` 完成的。有关多阶段构建如何工作的更多信息,请参阅docs.docker.com/develop/develop-images/multistage-build
  • 是否有理由不在您的服务器上使用 docker-compose up?我建议你坚持使用 Docker Compose,它更容易控制。您可能必须停止并删除现有容器。他们经常被卡住,并且图像的重建永远不会覆盖旧图像,因为它在完美世界中应该这样做。运行 docker ps -a,获取每个 ID,然后获取 docker stop <id>docker rm <id>。首先让我们知道这是否有帮助。
  • 使用docker-compose up --build --force-recreate 似乎也能解决一些问题。要摆脱系统上的每个悬挂容器,只需docker system prune -f。重新开始,通常问题就解决了。
  • @MarcSances 谢谢你的建议,不幸的是,我试过了,但没有成功。
  • @anatolhiman 你能用来自 docker hub 的图像做 docker-compose 吗?

标签: node.js postgresql docker docker-compose dockerfile


【解决方案1】:

当您执行npm run start 命令时,您应该使用CMD 而不是RUNCMD 每次启动容器时都会运行,而 RUN 只在构建时执行一次。

这意味着您启动了容器,但在其中没有启动任何其他内容。所以它退出了,因为没有什么要执行的了。 RUN 已在您上次构建容器时执行。

使用RUN 进行 npm 安装,否则每次它都会尝试重新安装你已经拥有的 node_modules。但是对于启动命令 - 改为:CMD ["npm", "run", "start"]

如果它可以帮助你,我会向你展示我的工作 docker-compose.yml 和 Dockerfile。使用 Postgres 数据库的 Express API。

这是经过测试的,可以在 Ubuntu 服务器和开发机器上运行(两种环境都使用 docker-compose up)。请注意,有两个 Dockerfile (dev/prod)。

您不需要在 docker-compose 中添加密码/用户内容,只需包含您的 env_file 并且 Docker/docker-compose 会为您正确设置所有内容。

version: "3.8"
services:

# D A T A B A S E #

  db:
    env_file:
      - ./.env
    image: postgres
    container_name: "db"
    restart: always
    ports:
      - "${POSTGRES_PORT}:${POSTGRES_PORT}"
    volumes:
      - ./db-data/:/var/lib/postgresql/data/

# A P I #

  api:
    container_name: "api"
    env_file:
      - ./.env
    build:
      context: .
      dockerfile: "DOCKERFILE.${NODE_ENV}"
    ports:
      - ${API_PORT}:${API_PORT}
    depends_on:
      - db
    restart: always
    volumes:
      - /app/node_modules
      - .:/usr/src/service
    working_dir: /usr/src/service

# A D M I N E R #

  adminer:
    env_file:
      - ./.env
    container_name: "adminer"
    image: adminer:latest
    restart: always
    ports:
      - ${ADMINER_PORT}:${ADMINER_PORT}
    depends_on:
      - db

Dockerfile.dev:

    FROM node:14.17.3
    ENV NODE_ENV=dev
    WORKDIR /
    COPY ./package*.json ./
    RUN npm install
    COPY . .
    EXPOSE 8080
    CMD ["npm", "run", "start"]

Dockerfile.prod 大同小异,把环境改成 prod 就可以了。

我看到您在复制时包含了主目录的完整路径,请尝试不使用它。只需从 / 处相对于 Dockerfile 的位置复制即可。

【讨论】:

  • 我已经尝试了你建议的编辑,所以 CMD 和 WORKDIR 不幸的是我仍然面临同样的问题。
  • 试试docker logs <container_id> 看看是否有更多信息。您现在使用的是 docker run 还是 docker-compose up?如果是 docker run,您应该在命令中包含重启策略 (--restart)。你也可以试试docker inspect <container_id>。退出代码 0 通常表示一切正常,它退出是因为容器中的进程退出了。因此,您尝试使用 npm run start 运行的脚本可能有问题。
猜你喜欢
  • 2019-12-27
  • 2018-12-13
  • 2020-08-24
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多