【问题标题】:Why Dockerfile doesn't run multiple commands为什么 Dockerfile 不运行多个命令
【发布时间】:2018-09-29 10:20:14
【问题描述】:

我想用 Docker 运行我的项目(react+nodejs+mongodb),

Dockerfile:

FROM node:8.9-alpine

ENV NODE_ENV production

WORKDIR /usr/src/app

COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]

RUN npm install --production --silent && mv node_modules ../

COPY . .

CMD nohup sh -c 'npm start && node ./server/server.js'

docker-compose.yml:

version: '2.1'

services:
  chat:
    image: chat
    container_name: chat
    build: .
    environment:
      NODE_ENV: production
    ports:
      - "3000:3000"
      - "8080:8080"
    volumes:
      - ./:/usr/src/app
    links:
      - mongo
  mongo:
    container_name: mongo
    image: mongo
    ports:
      - "27017:27017"

运行docker-compose up --build,3000端口工作,但8080端口死了

localhost:3000

localhost:8080

【问题讨论】:

  • 您的应用程序是否在 8080 端口上运行,您可以查看 server.js 文件吗?
  • 你有日志吗?没有代码也很难弄清楚,只要 server.js 文件就可以了。你为什么要移动 node_modules 文件夹
  • 8080端口死了是什么意思?如果您的进程不在端口 8080 上侦听,那么很明显您将无法从那里获得任何连接。 8080应该是什么?你的服务器?如果是,那么端口 3000 上的内容是什么?
  • 8080 端口是我的服务器,3000 端口是反应应用程序端口
  • 哪个服务监听 8080 端口?

标签: docker docker-compose dockerfile


【解决方案1】:

我建议为服务器创建一个容器,并将其与“聊天”容器分开。最好让每个容器只做一件事和一件事(几乎就像 unix 命令背后的哲学)

无论如何,这里是我将对撰写文件进行的一些修改。

version: '2.1'

services:
  chat:
    image: chat
    container_name: chat
    build: .
    environment:
      NODE_ENV: production
    ports:
      - "3000:3000"
      - "8080:8080"
    volumes:
      - ./:/usr/src/app
    links:
      - mongo
  mongo:
    container_name: mongo
    image: mongo
#   You don't need to expose this port to the outside world. Because you linked the two containers the chat app
# will be able to connect to mongodb using hostname mongodb inside the container network.
#    ports:
#      - "27017:27017"

顺便说一句,如果你运行会发生什么:

$ docker-compose down

然后

$ docker-compose up

$ docker ps

你能看到 docker ps 输出中暴露的端口吗?

【讨论】:

    【解决方案2】:

    您的聊天服务依赖于 mongo,因此您还需要在聊天中使用它

    depends_on:
      - mongo
    

    这个 docker-compose 文件对我有用。请注意,我将数据库中的数据保存到本地目录。您应该将此目录添加到 gitignore。

    version: "3.2"
    services:
      mongo:
        container_name: mongo
        image: mongo:latest
        environment:
          - MONGO_INITDB_ROOT_USERNAME=root
          - MONGO_INITDB_ROOT_PASSWORD=password
          - NODE_ENV=production
        ports:
          - "28017:27017"
        expose:
          - 28017 # you can connect to this mongodb with studio3t
        volumes:
          - ./mongodb-data:/data/db
        restart: always
        networks:
          - docker-network
      express:
        container_name: express
        environment:
          - NODE_ENV=development
        restart: always
        build:
          context: .
          args:
            buildno: 1
        expose:
          - 3000
        ports:
          - "3000:3000"
        links:
          - mongo # link this service to the database service
        depends_on:
          - mongo
        command: "npm start" # override the default command to use nodemon in dev
        networks:
          - docker-network
    networks:
      docker-network:
        driver: bridge

    您可能还会发现使用 node 必须等待 mongodb 容器准备好才能连接到数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2021-01-29
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多