+-
使用docker-compose重新加载docker化node.js应用程序中的代码
我有一个简单的node.js docker app.

我能够成功运行它,但是尽管按照docker-compose docs中的描述安装了卷,但容器内部重新加载的代码仍无法正常工作.

目录布局:

my-test-app
| docker-compose.yml
| Dockerfile
| index.js
| package.json

Dockerfile:

FROM mhart/alpine-node:8
WORKDIR /app
COPY . .
EXPOSE 5000
CMD ["node", "index.js"]

泊坞窗,compose.yml:

version: '3'
services:
  node-app:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
  redis:
    image: "redis:alpine"

index.js:

const http = require('http');
const server = http.createServer((req, res) => {
  res.end("hello world");
});
server.listen(5000);

的package.json:

{
  "name": "my-test-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "author": "",
  "license": "MIT"
}

我也尝试了以下相同的结果(应用程序运行,无法重新加载代码)

>使用官方节点图像,而不是alpine-node.
>将应用程序代码放在my-test-app下的./app文件夹中,并相应地更新Docker文件中的COPY和docker-compose.yml中的卷.

最佳答案
我看过用于两种不同类型重新加载的短语“live reload”:

>杀戮&代码更改时重新启动应用程序,以及
>自动重新加载HTML&代码更改时客户端浏览器上的资产.

根据您的问题,我认为您指的是第一种类型,因此下面的答案解决了这个问题.

这里的问题是上下文之一.

请记住,docker容器与主机隔离 – 具体而言,容器中运行的进程与主机上运行的进程不同(并且通常无法与之交互).在您的情况下,您已选择在容器中安装主机目录,但这只是文件系统,而不是进程.

在实例化新容器时,请考虑Docker镜像的作用:它在WORKDIR中运行节点index.js.代码在哪里停止并在代码更改时重新启动它?据推测它正在主机上运行.这意味着它无法触及容器中运行的节点进程(因为它是隔离的).

现在,您还没有提到您使用什么方法来处理实时重新加载,但这不应该产生太大的差别.它们基本上都以相同的方式工作:在更改应用程序代码时,终止现有流程并启动新流程.

要解决此问题,您有两种选择:

>在容器内运行“实时重新加载”代码,或
>在容器外部运行开发代码

首先,您可以按照@ MarkS的建议使用nodemon.这应该像更换一样简单

CMD ["node", "index.js"]

在您的Dockerfile中

CMD ["nodemon", "index.js"]

当然,前提是您已在图像中正确安装了nodemon.

我所做的另一种选择是在开发期间在Docker环境之外的主机上运行代码,然后在部署时将其打包在映像中.这解决了两个问题:

>您遇到孤立节点进程的问题,以及
>许可问题.

请记住,在Docker中运行的应用程序是以root身份运行的.这意味着如果您的应用创建文件,它们将由root拥有.我尝试在Docker环境中进行开发,但对问题感到沮丧,例如,我想删除应用程序创建的文件,并且必须sudo(以root用户身份登录)才能清理内容.

点击查看更多相关文章

转载注明原文:使用docker-compose重新加载docker化node.js应用程序中的代码 - 乐贴网