如何通过docker动态更改节点项目中的内容

时间:2018-02-08 03:56:22

标签: node.js docker npm dockerfile

我有一个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文件来实现)

3 个答案:

答案 0 :(得分:5)

你是对的,你应该使用卷来做这样的事情。在开发期间,为其提供与COPY目录相同的卷。它会使用您机器上的任何内容覆盖它,无需重建映像,甚至重新启动容器。非常适合发展。

实际烘焙图片以进行制作时,您会移除卷,保留COPY,然后您将获得确定性容器。我建议你在这里阅读这篇文章:https://docs.docker.com/storage/volumes/

一般来说,有三种方法可以做卷。

  1. Define them in your dockerfile using VOLUME

    就个人而言,我从未这样做过。我并没有真正看到这对其他两种方法的好处。我相信,当您的卷用作永久数据存储时,这样做会更常见。当您只是尝试使用您的实时开发环境时,并非如此。

  2. Define them when calling docker run

    docker run ... -v $(pwd)/src:/usr/src/app ...
    

    这很好,因为如果你的dockerfile中的COPY./src /usr/src/app,那么它会在运行图片时暂时覆盖目录,但是当你没有&#39时,它仍然可以用于部署; t使用-v

  3. Use docker-compose

    我的个人推荐。 Docker组合大规模简化了运行容器。为简单起见,只需调用docker run ...,但基于给定的docker-compose.yml配置自动化参数。

    创建一个dev服务,指定要装入的卷,您想要链接到的其他容器等。然后根据您的需要使用docker-compose up ...docker-compose run ...启动它

  4. 智能地使用卷将极大地缩短您的开发周期。真的建议调查一下。

答案 1 :(得分:1)

是的,每次文件更改时都需要重建,因为您只修改容器外部的文件。要将更改应用于容器中的文件,您需要重建容器。

根据用例,您可以让Docker Container从另一个存储库动态加载文件,也可以安装外部卷以在容器中使用,但是这两种解决方案都存在一些陷阱。

答案 2 :(得分:1)

如果您想在添加文件时保持容器正常运行,您还可以使用变体。

  1. 将卷安装到任何其他位置,例如的/ usr / SRC /分期。
  2. 当容器正在运行时,如果需要将新文件复制到容器中,请将它们复制到已装入卷的位置。
  3. 运行docker exec -it <container-name> bash以在正在运行的容器中打开bash shell。
  4. 运行cp /usr/src/staging/* /usr/src/app命令将所有新文件复制到目标文件夹中。