node.js - 如何动态更改通过docker运行的 Node 项目中的内容

标签 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 文件来完成)

最佳答案

你是对的,你应该为这样的东西使用卷。在开发过程中,为其提供与 COPY 目录相同的卷。它会用你机器上的任何东西覆盖它,不需要重建图像,甚至不需要重新启动容器。非常适合开发。

当实际烘焙您的图像以用于生产时,您删除卷,保留 COPY,您将获得一个确定性容器。我建议您在这里通读这篇文章:https://docs.docker.com/storage/volumes/ .

一般来说,做卷有3种方式。

  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 那么它会在运行图像时暂时覆盖目录,但是当您不使用 -v 时,它仍然用于部署。

  3. Use docker-compose .

    我的个人推荐。 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/

相关文章:

node.js - 需要有关 Nodejs api 的 nginx 配置的帮助

javascript - 在 macOS 上写入 Node.js 中的 ~/Documents 文件夹?

ruby-on-rails - 有没有一种简单的方法可以在 Rails 和 Node.js 应用程序之间共享存储在 Redis 中的 session 数据?

Docker - 来自守护程序 : client is newer than server 的错误响应

amazon-web-services - 在Amazon Container Service上定义任务时出错

docker - 启动docker时可以重置urandom吗?

javascript - npm install 带有几个 package.json

javascript - 仅当所有 ava 测试都通过时才运行命令

npm - Package.json,添加本地目录到 node-modules

javascript - 过滤掉嵌套列表中具有特定键的字典元素