关于node.js:是否必须为Gulp us启动Node Docker容器?

Does a Node Docker container has to be started for Gulp us?

我不知道我的问题是否愚蠢,但经过几个小时的思考,我更愿意问你。

我正在一个码头集装箱(windows)上运行NPM。我不想要一个真正的"节点服务器";我只是使用NPM来运行诸如gulp、webpack、browserify、vue.js等实用程序…

所以我在我的./docker-compose.yml文件中添加了这个:

1
2
3
4
5
services:    
  node:
    build: docker/node
    environment:
      - NODE_ENV=dev

在这里之前,我脑子里的一切都很好。下面是我的./docker/node/Dockerfile的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# See https://github.com/nodejs/docker-node#dockerfile
FROM node:6

EXPOSE 8080

USER node

# set the working directory
RUN mkdir /home/node/app
WORKDIR /home/node/app

# delete existing modules and re-install dependencies
COPY package.json /home/node/app/package.json
RUN rm -rf node_modules
RUN npm install

# launch the app
# EDIT : I removed this line to solve the issue. See answer.
CMD  ["npm","start"]

为了创建它,我只是遵循官方的教程。然后,这是我的./docker/node/package.json文件:

1
2
3
4
5
6
7
8
9
10
{
 "name":"custom-symfony-project",
 "version":"1.0.0",
 "dependencies": {
   "gulp":"^4.0.0"
  },
 "devDependencies": {
   "gulp":"^4.0.0"
  }
}

我也有3个容器:PHP、MySQL和nginx,但它们都是独立的,并且都是正确启动的,所以我不认为它们是问题的症结所在。

所以我运行我的docker-compose build:一切正常。

但是当我运行docker-compose start时,我在节点容器日志中得到了一些东西:

1
npm ERR! missing script: start

我试图添加一个空的server.js,但容器没有启动。

所以我的问题是:我真的需要开始做什么吗?我需要server.js吗?我不知道该放什么进去。

当我在Ubuntu中使用NPM时,我从来没有指定过一个开始脚本。

谢谢!


容器被设计为只要其支持的进程正在运行就可以运行,并且容器应该只运行一个进程。在您的情况下,您正在删除CMD行,该行正在启动容器支持的过程,因此容器没有任何操作,只是立即关闭。

您应该将Docker容器看作一个进程,而不是虚拟机。一个虚拟机将加载节点和其他依赖项,并且它可以随时在您登录到它时运行命令,但是一个容器旋转起来运行一个命令,然后关闭。

听起来你想让这个容器旋转起来,喝水,然后关机。如果是这种情况,您可以使用这样的CMD行(假设您在Dockerfile中全局安装gulp):

1
CMD ['gulp']

或者你想让它旋转起来,用gulp-watch观察变化?在这种情况下,CMD应该是这样的:

1
CMD ['gulp', 'watch']

如果您选择其中一个选项,请注意,除非使用绑定挂载,否则Gulp将在容器内而不是主机文件系统上构建文件。绑定挂载将允许主机文件系统与容器共享一个目录,并方便对文件进行单向或双向更新。


好的,所以我把CMD线移到dockerfile中,但容器只是自然停止。

因此,我在docker-compose.yml文件中添加了tty: true选项,以便使容器保持活动状态,即使当前没有任何内容在其上运行,而且目前它似乎工作正常:

1
2
3
4
5
6
node:
    build: docker/node
    environment:
      - NODE_ENV=dev
    container_name: symfony4-windock-node
    tty: true