【问题标题】:Docker: Node server is not running after start the serverDocker:启动服务器后节点服务器未运行
【发布时间】:2020-11-17 09:19:39
【问题描述】:

我有一个Dockerfile 和一个docker-compose.yml 文件。 如果我执行docker-compose up,它会返回:

    Creating network "demoapi_webnet" with the default driver
    Creating demoapi_web_1 ... done
    Creating d2c_postgres  ... done
    Attaching to demoapi_web_1, d2c_postgres
...
d2c_postgres | 2020-07-28 00:47:48.772 UTC [1] LOG:  database system is ready to accept connections

但是我的节点服务器没有启动。 这些是我的 docker 配置文件:

Dockerfile

FROM node:12.13-alpine As development
WORKDIR /app
COPY package.json .
COPY package-lock.json .
RUN npm install
COPY dist .
COPY wait-for-it.sh .
CMD ["npm", "run", "start"]

docker-compose.yml

version: '3'
services:
    db:
        image: postgres
        networks: 
            - webnet
        container_name: "d2c_postgres"
        environment:
            POSTGRES_PASSWORD: 010203
            POSTGRES_USER: postgres
            POSTGRES_DB: demo
        ports:
            - "5432:5432"
    web:
        image: nest-app
        ports: 
            - "3000:3000"
        networks:
            - webnet
        environment: 
            DB_HOST: db
        command: ["./wait-for-it.sh", "db:5432", "--", "npm", "run", "start"]
networks:
    webnet:

我唯一的线索是这一行: env: 无法执行 'bash': 没有这样的文件或目录

我可以使用该配置建立与 pgadmin/postgres 的连接,但 node 服务器没有启动。我做错了什么,我该如何解决?

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    Wait-for-it 基于 bash,它与 alpine 不兼容,因为 alpine 基于 ash 或 sh,这就是您看到 can't execute 'bash': No such file or directory 的原因。您可以查看开放问题以获得 alpine 支持。

    Can you make an /bin/sh version for use with alpine linux

    对于高山,你可以使用wait-for

    ./wait-for 是一个脚本,旨在同步 docker 容器等服务。它与 sh 和 alpine 兼容。

    services:
      db:
        image: postgres:9.4
    
      backend:
        build: backend
        command: sh -c './wait-for db:5432 -- npm start'
        depends_on:
          - db
    

    【讨论】:

      【解决方案2】:

      经过大量研究,我在这里发现了一个类似的问题: docker-compose: nodejs container not communicating with Postgres container

      由于某种原因wait for it 无法工作(不确定是否是 Windows 问题),sh 文件不是必须等到数据库启动,您可以使用 depends_on 指示服务器应该启动在指定服务之后:

      version: '3'
      services:
          db:
              image: postgres
              networks: 
                  - webnet
              container_name: "node_postgres"
              environment:
                  POSTGRES_PASSWORD: 010203
                  POSTGRES_USER: postgres
                  POSTGRES_DB: demo
              ports:
                  - "5432:5432"
          web:
              image: nest-app
              depends_on:
                  - db
              ports: 
                  - "3000:3000"
              networks:
                  - webnet
              environment: 
                  DB_HOST: db
              command: ["npm", "run", "start"]
      networks:
          webnet:
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 1970-01-01
        相关资源
        最近更新 更多