Docker:使用nodemon重新加载nodejs应用程序

时间:2016-07-13 22:09:33

标签: docker docker-compose dockerfile

我有一个 hello,world Express应用程序,我使用nodemon运行,这样每当我更改文件时,服务器都会重新启动。

我将应用程序打包为docker镜像。

Dockerfile

FROM node:6.3.0

RUN mkdir -p /opt/app
WORKDIR /opt/app

COPY . /opt/app

RUN npm install

EXPOSE 3000

CMD ["npm", "start"]

npm startpackage.json

中的定义运行nodemon -L index.js

但是,每次我对我的应用程序进行更改时,我都无法构建图像。 我还有一个 docker-compose.yml 文件,我在其中指定build选项,但我仍然无法使用

重新加载容器
version: "2"
services:
  rpro:
    build: .
    command: npm start
    ports:
      - "3000:3000"
    volumes:
      - /opt/app

这里是entire repo

如何使用docker容器在文件更改时重新启动服务器?在这种情况下,通常的开发工作流程是什么?

2 个答案:

答案 0 :(得分:16)

啊,问题似乎是 docker-compose.yml volumes param。 将其更改为

volumes:
  - .:/opt/app

让它发挥作用。它告诉docker将主机上的应用程序文件夹.挂载到容器中的/opt/app

然后在执行docker-compose up之后,服务器会在文件更改时重新启动。

答案 1 :(得分:1)

不确定我是否会将此称为问题,因为它是通常的工作流程 - 当文件更改驻留在容器中时,它将触发重建。如果你没有把文件放在容器中,它就不会这样做,所以@jatin提到,你可以通过- .:/opt/app或类似的方式链接你的Compose目录。

如果您这样做,则不需要在构建中使用COPY . /opt/app,因为它将挂载在该目录上。

注意docker-compose up --build只有当构建中的文件发生更改时,如果已装入卷中的文件发生更改,Docker将不会重建(重新启动服务器)。由于您似乎正在通过nodemon查看文件,因此可能重新启动(因为您正在使用旧版手表,只需注意有些情况下可能无法识别文件更改)。

这对于开发来说基本上是好的,但是在生产中,显然你不想使用watch并且你最有可能使用Docker来监视并重新启动容器(restart: always })或在非守护进程模式下使用进程管理器。