我有一个 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 start
按package.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容器在文件更改时重新启动服务器?在这种情况下,通常的开发工作流程是什么?
答案 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
})或在非守护进程模式下使用进程管理器。