我有一个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文件来实现)
答案 0 :(得分:5)
你是对的,你应该使用卷来做这样的事情。在开发期间,为其提供与COPY
目录相同的卷。它会使用您机器上的任何内容覆盖它,无需重建映像,甚至重新启动容器。非常适合发展。
实际烘焙图片以进行制作时,您会移除卷,保留COPY
,然后您将获得确定性容器。我建议你在这里阅读这篇文章:https://docs.docker.com/storage/volumes/。
一般来说,有三种方法可以做卷。
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
,那么它会在运行图片时暂时覆盖目录,但是当你没有&#39时,它仍然可以用于部署; t使用-v
。
我的个人推荐。 Docker组合大规模简化了运行容器。为简单起见,只需调用docker run ...
,但基于给定的docker-compose.yml
配置自动化参数。
创建一个dev
服务,指定要装入的卷,您想要链接到的其他容器等。然后根据您的需要使用docker-compose up ...
或docker-compose run ...
启动它
智能地使用卷将极大地缩短您的开发周期。真的建议调查一下。
答案 1 :(得分:1)
是的,每次文件更改时都需要重建,因为您只修改容器外部的文件。要将更改应用于容器中的文件,您需要重建容器。
根据用例,您可以让Docker Container从另一个存储库动态加载文件,也可以安装外部卷以在容器中使用,但是这两种解决方案都存在一些陷阱。
答案 2 :(得分:1)
如果您想在添加文件时保持容器正常运行,您还可以使用变体。
docker exec -it <container-name> bash
以在正在运行的容器中打开bash shell。cp /usr/src/staging/* /usr/src/app
命令将所有新文件复制到目标文件夹中。