Docker未更新目录中的更改

12

我是docker新手,正在尝试测试一个node服务器。

Dockerfile

FROM node:8

WORKDIR /home/test-ci-node
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]

server.js

var http = require('http');

//create a server object:
http.createServer(function (req, res) {
    console.log("got req");
    res.write('Hello World'); //write a response to the client
    res.end(); //end the response
}).listen(8080); //the server object listens on port 8080

console.log("listining at 8080");

我使用以下命令启动了Docker镜像:

docker run -p 8080:8080 -d docker_img

现在,在server.js文件中,我将响应更改为:

res.write('Hello World changed!');

然后,我尝试重新启动容器,但更改并没有反映出来,我尝试了一些谷歌方法,但结果仍然相同。

要使更改生效,我必须重新构建镜像。

所以,有没有一种正确的方法可以在不重新构建镜像的情况下反映更改。


2
好的,你的代码只有在构建时才会复制。因此,如果你想要在外部更改你的 server.js 文件,你需要使用共享卷,例如 -v /var/www/docker:/home/test-ci-node。 - Dominic Wehrmann
我看到你是一个新的贡献者。别忘了阅读行为准则,请记得验证解决你问题的答案,这样它就不会出现在未解决的问题中 :) - Artandor
2个回答

10

在您的 Docker 文件中,您正在使用

COPY . .

这意味着,当您构建docker时,您将当前文件夹复制到容器的默认文件夹中。可能是 /root

但是这个复制不会在每次运行或启动容器时执行,只有在 BUILD 时才会执行。

为了能够实时查看您所做的每一个更改,而不必重新构建,您需要创建一个卷,它将是主机和容器之间的链接。主机或容器上的每个内容更改都将共享到另一个。

请注意,在您的Dockerfile中声明VOLUME并不实际改变任何内容,它只是一个信息。要实际创建一个卷,您需要在docker run命令行中添加-v /host/path:/container/path。


0

删除复制语句并将其粘贴到您自己的路径下面,ADD还支持全局变量 ADD /host/path /container/path


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接