使用docker-compose运行nodejs不起作用,但可以使用docker run命令运行

时间:2020-02-11 00:57:12

标签: node.js docker docker-compose

我正在尝试使用Nodejs官方docker镜像运行一个容器。所有与此下面的“ docker run”命令一起使用:

docker run -it -p 8080:8080 --name nodejs --volume ${PWD}/app:/usr/node/app --workdir /usr/node/app node:12 bash

但是我会使用docker-compose,所以我尝试这样做:

version: "3"

services:
  nodejs:
    container_name: nodejs
    image: node:12
    working_dir: /usr/node/app
    volumes:
      - ${PWD}/app:/usr/node/app
    ports:
      - 8080:8080

但是当我运行> docker-compose up

Creating network "node_default" with the default driver
Creating nodejs ... done
Attaching to nodejs
nodejs exited with code 0

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

运行docker run命令时,您将覆盖docker容器中的CMD,并将自己直接附加到该容器的外壳上。

docker run -it -p 8080:8080 --name nodejs --volume ${PWD}/app:/usr/node/app --workdir /usr/node/app node:12 bash

但是,在使用docker-composeKubernetes时,事情并不是那么简单。他们将旋转容器并执行ENTRYPOINTCMD。一旦这些命令退出,容器将退出。对于您的docker-compose,它正在执行docker-entrypoint.sh node,它将立即退出。

您可以通过运行docker-compose ps来验证这一点,并查看容器状态为Exit 0

如果您要使容器永久运行而不退出,可以将docker-compose文件更新为这样

version: "3"

services:
  nodejs:
    container_name: nodejs
    image: node:12
    working_dir: /usr/node/app
    volumes:
      - ${PWD}/app:/usr/node/app
    ports:
      - 8080:8080
    entrypoint: bash
    command:
      - -c
      - |
        tail -f /dev/null

此后,您应该运行docker-compose up -d以在detach模式下运行,这将使容器在后台运行,并验证其是否在docker-compose ps下运行。

为了进入容器,您可以运行命令

docker exec -it nodejs bash

注意::如果您运行docker-compose up,似乎一切都挂起了,但实际上,您看到的是该容器的stdout,它什么也没打印出来。 Ctrl+C将带您离开并同时停止容器。