我有一个 angularjs 应用程序,我正在使用 docker 运行。 docker 文件如下所示:-
FROM node:6.2.2
RUN npm install --global gulp-cli && \
npm install --global bower
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
COPY bower.json /usr/src/app/
RUN npm install && \
bower install -F --allow-root --config.interactive=false
COPY . /usr/src/app
ENV GULP_COMMAND serve:dist
ENTRYPOINT ["sh", "-c"]
CMD ["gulp $GULP_COMMAND"]
现在,当我对任何 html 文件进行任何更改时,它不会动态加载到网页上。我必须停止容器,将其删除,再次构建镜像,删除较早的镜像,然后从新镜像重新启动容器。我每次都必须这样做吗? (我是 docker 的新手,我想这个问题是因为我的源代码没有放入卷,但我不知道如何使用 docker 文件来完成)
最佳答案
你是对的,你应该为这样的东西使用卷。在开发过程中,为其提供与 COPY
目录相同的卷。它会用你机器上的任何东西覆盖它,不需要重建图像,甚至不需要重新启动容器。非常适合开发。
当实际烘焙您的图像以用于生产时,您删除卷,保留 COPY
,您将获得一个确定性容器。我建议您在这里通读这篇文章:https://docs.docker.com/storage/volumes/ .
一般来说,做卷有3种方式。
Define them in your dockerfile using
VOLUME
.就我个人而言,我从未这样做过。我真的看不出这与其他两种方法相比有什么好处。我相信当您的卷打算充当永久数据存储时,这样做会更常见。当您只是尝试使用您的实时开发环境时,就不是那么回事了。
Define them when calling
docker run
.docker run ... -v $(pwd)/src:/usr/src/app ...
这很好,因为如果你的 dockerfile 中的
COPY
是./src/usr/src/app
那么它会在运行图像时暂时覆盖目录,但是当您不使用-v
时,它仍然用于部署。-
我的个人推荐。 Docker compose 极大地简化了运行中的容器。为了简单起见,只需调用
docker run ...
但会根据给定的docker-compose.yml
配置自动执行参数。创建一个
dev
服务,指定您要挂载的卷、您希望它链接到的其他容器等。然后使用docker-compose up ...
启动它> 或docker-compose run ...
取决于您的需要。
巧妙地使用卷将显着缩短您的开发周期。真的会建议调查它们。
关于node.js - 如何动态更改通过docker运行的 Node 项目中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677281/