【发布时间】:2016-08-05 10:48:47
【问题描述】:
我在大约一个月前开始使用 docker,但无法找到令人满意的解决方案来解决以下情况。
我想部署一个 NodeJS 应用程序,因为使用 ENTRYPOINT 是最佳实践,我更喜欢使用这个命令:
ENTRYPOINT ["node", "src/start.js"].
但是我还没有找到在容器中重新启动入口点进程的方法,这意味着每次我在 nodejs 应用程序中更改某些内容时,我都必须重新启动整个容器,这在具有共享卷的开发环境中有点烦人。
我想到的一个解决方案是为此使用进程管理器,并执行ENTRYPOINT ["pm2", "src/start.js"] 之类的操作,但对单个进程使用进程管理器对我来说似乎是错误的。
我想寻求一种方法,让我尽可能接近热插拔,而无需在“开发 Docker”和“生产 Docker”之间更改 Dockerfile。
TL;DR:应该可以在我的开发机器上不安装 NodeJS 或应用程序所需的任何东西,但可以在 docker 容器中运行所有内容,同时能够重新启动所述节点进程容器,而无需重新启动容器本身。更改 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
【问题讨论】:
-
重启容器有什么问题?这只是一个附加了一些 cgroup 和命名空间的进程。 “容器”的重量相对较轻,不会导致 nodejs 加载应用程序的速度过慢。您是否更关心在更改之间重建容器映像?
-
重启容器本身并没有什么问题,我只是一个非常不耐烦的人:) 我不喜欢等待 30 秒,因为我可以在 2 秒内获得相同的效果。虽然容器相对轻量级,但我认为为单个进程重新启动整个底层“系统”没有多大意义。
-
你能用你用来“重启”你的应用程序的步骤来更新这个问题吗?
docker run <myimage> node src/start.js应该比node src/start.js慢得多,所以也许您在每次容器重新启动时重建映像?还是使用 docker-compose 并重新启动构成“系统”的多个容器?我相信您要问的问题是“我怎样才能加快我的 Node.js+Docker 开发和构建过程而不偏离生产构建太远”,我们只是在术语上有一些差异。 -
因此您不会在每次重新启动时重建映像,因为您已安装本地应用程序目录。是
docker stop需要很长时间吗? -
既然你提到了,是的,docker stop 需要很长时间。
标签: node.js docker process-management