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

Shu*_*pta 3 node.js npm docker dockerfile

我有一个angularjs应用程序,正在使用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"]
Run Code Online (Sandbox Code Playgroud)

现在,当我对任何html文件进行任何更改时,它都不会在网页上动态加载。我必须停止容器,将其删除,再次构建映像,删除先前的映像,然后从新映像重新启动容器。我每次都必须这样做吗?(我是Docker的新手,我想这个问题是因为我的源代码未投入使用,但我不知道如何使用Docker文件来实现)

SCB*_*SCB 6

没错,您应该使用卷来存储此类内容。在开发过程中,为其提供与COPY目录相同的卷。它将使用您计算机上的任何内容覆盖它,无需重建映像,甚至无需重新启动容器。适合发展。

实际烘焙图像进行生产时,您可以删除卷,将其保留COPY在里面,然后将获得确定性的容器。我建议您在这里阅读本文:https : //docs.docker.com/storage/volumes/

通常,有3种方式进行卷。

  1. 使用在您的dockerfile中定义它们VOLUME

    就个人而言,我从未做到过。与其他两种方法相比,我看不出这样做的好处。我相信,当您要将卷用作永久数据存储时,执行此操作将更为常见。当您只想使用实时开发环境时,没有那么多。

  2. 在调用时定义它们docker run

    docker run ... -v $(pwd)/src:/usr/src/app ...
    
    Run Code Online (Sandbox Code Playgroud)

    这很棒,因为如果您COPY的dockerfile中./src /usr/src/app的文件在运行映像时会暂时覆盖该目录,但是当您不使用它时,该目录仍可以进行部署-v

  3. 使用docker-compose

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

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

明智地使用卷将戏剧性地减少您的开发周期。真的会建议调查他们。