监听更改并在代码更改时重新加载容器 - docker-compose
Posted
技术标签:
【中文标题】监听更改并在代码更改时重新加载容器 - docker-compose【英文标题】:Listen to changes and reload container on code change - docker-compose 【发布时间】:2019-09-11 01:20:48 【问题描述】:我在 Visual Studio 2019 中将 docker-compose 与 docker 一起用于运行 linux 容器的 Windows。我想为 Angular 客户端应用启用热重载。
我修改了运行应用程序的 npm 命令以包含如下轮询:
"docker-start": "ng serve --host 0.0.0.0 --port 4200 --proxy-config proxy-conf.json --poll 1"
并像这样在 docker-compose 中添加了一个卷:
volumes:
- ./ClientApp:/app/
还额外暴露了 webpack 端口
ports:
- 4200:4200
- 49153:49153
docker-compose 文件位于 repo 的根目录,而 Angular 应用程序位于 /ClientApp 文件夹中。这使得每次导航到 localhost:4200 时应用程序都无法 GET\。如果我注释掉卷映射,应用程序开始工作,但重新加载没有。我希望它能够在每次更改任何前端代码时监听代码中的更改并根据需要更新容器。
整个 dockerfile:
FROM node:9.6.1
RUN mkdir -p /app
WORKDIR /app
EXPOSE 4200
EXPOSE 49153
ENV PATH /app/node_modules/.bin:$PATH
COPY . /app
RUN npm install --silent
RUN npm rebuild node-sass
CMD ["npm", "run", "docker-start"]
【问题讨论】:
你能发布 Dockerfile 或者更好的是你有 GitHub 上的代码吗?我想看看 /app 在有和没有映射的情况下如何变化。 @Mihai 谢谢。我无法发布源代码,但我使用客户端应用程序 dockerfile 更新了第一篇文章。 我明白了。您的卷实际上正在覆盖在映像的构建阶段完成的所有工作。我正在准备一个可能的解决方案。同时:打开音量,当你得到 GET 错误时,你能看到应用程序日志吗?如果您从容器内部运行相同的程序,它会起作用吗?它不应该,但至少你应该得到一个错误。或者应用程序根本没有启动,在这种情况下你仍然应该得到一个错误。您能否在应用程序日志中发布您可能遇到的任何错误? 【参考方案1】:当代码更改时,使用 nodemon 自动重启节点服务器。在此之前在您的 docker 映像中安装 nodemon 并确保它存在。
参考此 URL 安装 nodemon :https://www.npmjs.com/package/nodemon
然后在 Dockerfile 中更改你的 CMD
CMD ["nodemon", "--exec", "npm", "run", "docker-start"]
这是在代码更改时重新加载您的 nodejs 应用程序
【讨论】:
我试过了,但我仍然无法/GET【参考方案2】:您在这里可能会遇到几个问题,因为不幸的是 Docker 和 Windows 不能很好地相处。
cannot GET\
错误很奇怪,不应该发生。首先,您可能想验证您的卷是否已正确安装,并且在运行容器后所有数据都在那里。
如果容器内的工作目录为空(可能是这种情况),您可以尝试检查 docker 设置,是否正确共享所需的驱动器。
如果是,但您仍然看不到任何您可能想要重置凭据的数据。这需要您向 docker 提供您的 Windows 密码。
坏消息
坏消息是,根据Docker Docs,显然inotify
事件(用于检测已安装卷上的更改)在 Windows 上还不能与 Docker 一起使用。您可能希望遵循他们关于如何解决该问题的建议。
好消息
幸运的是,有许多项目试图解决您的问题,例如Go-Touch。我自己还没有验证过,但我希望你能从中受益。
【讨论】:
对于那些未来阅读的人:inotify
确实自 Docker Desktop for Windows 2.2.0.0 版起在 Windows 上工作(请参阅here)!以上是关于监听更改并在代码更改时重新加载容器 - docker-compose的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 Docker 容器的 NextJS 在更改开发环境的代码后没有重新加载?