我大约一个月前开始使用docker,但无法找到满足以下情况的令人满意的解决方案.
我想部署一个NodeJS应用程序,并且由于使用ENTRYPOINT是一种最佳实践,所以我更喜欢使用以下命令:
ENTRYPOINT [“ node”,“ src / start.js”].
但是,我还没有找到一种方法来重新启动容器中的入口点过程,这意味着每次我在nodejs应用程序中进行更改时,都必须重新启动整个容器,这在具有共享卷的开发环境中会很烦人.
我想到的解决方案是为此使用进程管理器,并执行类似ENTRYPOINT [“ pm2”,“ src / start.js”]的操作,但是对单个进程使用进程管理器对我来说似乎是错误的.
我想寻求一种方法,使我尽可能接近热交换,而无需在我的“开发Docker”和“生产Docker”之间完全更改Dockerfile.
TL; DR:应该可以在我的开发机器上不安装NodeJS或应用程序需要的任何东西,而可以在docker容器中运行所有内容,同时能够在所述容器中重新启动节点进程而不必重新启动容器本身.更改Dockerfile对我来说不是一个选择,我想使用ENTRYPOINT.
编辑:
Docker文件
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
最佳答案
这个pm2有一个很棒的npm模块.将其作为全局软件包安装在nodejs基础映像中.
使用ENTRYPOINT [“ pm2-docker”,“ src / start.js”]启动您的应用
然后可以使用docker exec -ti< containerid>输入docker映像. < shell>
并使用pm2 stop 0停止应用程序,然后重新配置,然后使用pm2 start 0重新启动它.Whitout杀死了容器,从而使pid1死亡.