大约一个月前,我就开始使用docker了,现在无法找到一个令人满意的解决方案来解决以下情况。
我想部署一个NodeJS应用程序,因为使用ENTRYPOINT是一种最佳实践,所以我倾向于使用以下命令:ENTRYPOINT ["node", "src/start.js"]。
但是,我还没有找到在容器中重新启动入口点进程的方法,这意味着每次我在nodejs应用程序中更改某些内容时,我都必须重新启动整个容器,这在具有共享卷的开发环境中有点烦人。
我想到的一个解决方案是为此使用流程管理器,并执行类似于ENTRYPOINT ["pm2", "src/start.js"]的操作,但对于单个流程使用流程管理器似乎是错误的。
我想要求一种方法,使我尽可能接近热交换,而不改变Dockerfile之间的“开发码头”和“生产码头”。
TL;DR:应该可以在我的开发机器上不安装NodeJS或应用程序所需的任何东西,但是可以从一个码头容器中运行所有东西,同时能够在所述容器中重新启动节点进程,而不必重新启动容器本身。更改Dockerfile对我来说不是一个选项,我想使用ENTRYPOINT。
编辑
Dockerfile
FROM mhart/alpine-node:4.4.7
# add curl and bash
RUN apk add --update curl bash
#Add user
RUN addgroup websites && adduser -s /bin/bash -D -G websites user-api
#Copy app
WORKDIR /srv/app
ADD src ./src/
ADD node_modules ./node_modules
#Expose port
EXPOSE 3000
ENTRYPOINT ["node", "src/start.js"]用
docker build -t app .在我的工作站上运行容器
docker run -dit -p 53017:3000 --name app -v c:/Users/hesxenon/Projects/app:/srv/app app:latest发布于 2016-12-16 15:10:10
对于这个pm2,有一个很好的npm模块。将其作为全局包安装在nodejs基础映像中。
用ENTRYPOINT ["pm2-docker", "src/start.js"]启动应用程序
然后,您可以使用docker exec -ti <containerid> <shell>输入停靠程序映像,并使用pm2 stop 0停止应用程序,然后重新配置,然后使用pm2 start 0重新启动它。惠特杀死了容器,于是pid1就死了。
发布于 2016-12-16 17:53:52
我认为最好的选择是使用nodemon:https://www.npmjs.com/package/nodemon
它监视您指定的源目录,并在发生任何更改时重新启动。
另外,为了增加容器的启动时间,如果您复制了package.json,然后在容器上运行npm安装,它将使用缓存的包json,可能会将其缩短到一两秒钟,因为node_modules将是您要复制的最大文件夹:当docker生成Dockerfile时如何缓存运行npm安装指令。
COPY package.json .
RUN npm install
COPY src ./src/发布于 2016-08-06 22:48:24
docker stop 默认情况下需要10秒 -您可以使用-t arg来调整这一点,但是docker restart应该是几乎即时的,并且应该与重新启动节点相同。
我不太清楚您所说的底层"system“是什么意思,它不是一个VM,只要您不重新启动Docker主机,重新启动容器(如果设置正确的话)就不会比重新启动进程本身花费更长的时间。
https://stackoverflow.com/questions/38787396
复制相似问题