Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何通过docker动态更改节点项目中的内容_Node.js_Docker_Npm_Dockerfile - Fatal编程技术网

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

Node.js 如何通过docker动态更改节点项目中的内容,node.js,docker,npm,dockerfile,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/a

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

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


根据用例的不同,您可以使Docker容器动态加载来自另一个存储库的文件,也可以装载一个外部卷以在容器中使用,但这两种解决方案都存在一些缺陷。

您是正确的,您应该使用卷来处理类似的内容。在开发过程中,为其提供与
COPY
目录相同的卷。它将用机器上的任何东西覆盖它,无需重建映像,甚至无需重新启动容器。非常适合发展

在实际烘焙图像进行生产时,您需要删除卷,将
副本保留在中,然后您将得到一个确定性容器。我建议您在此处通读这篇文章:

一般来说,有3种方法来处理卷

  • 就我个人而言,我从来没有这样做过。与其他两种方法相比,我并不认为这有什么好处。我相信,当您的卷用作永久数据存储时,这样做会更常见。当您只是尝试使用您的live dev环境时,情况就不是这样了

  • 这很好,因为如果dockerfile中的
    副本
    /src/usr/src/app
    ,那么它会在运行映像时临时覆盖目录,但当您不使用
    -v
    时,它仍然在那里进行部署

  • 我个人的推荐。Docker compose大大简化了运行的容器。为了简单起见,只需调用
    docker run…
    ,但会根据给定的
    docker compose.yml
    config自动执行参数

    创建一个
    dev
    服务,指定要装载的卷、要链接到的其他容器等。然后根据需要使用
    docker compose up…
    docker compose run…
    将其打开


  • 智能使用卷将大大缩短您的开发周期。如果您想在添加文件时保持容器运行,还可以使用变体

  • 将卷装载到任何其他位置,例如/usr/src/staging
  • 容器运行时,如果需要将新文件复制到容器中,请将其复制到已装入卷的位置
  • 运行
    docker exec-it bash
    在正在运行的容器中打开一个bash shell
  • 运行
    cp/usr/src/staging/*/usr/src/app
    命令将所有新文件复制到目标文件夹中

  • 如果在容器中装入外部卷,会有什么陷阱。我怎么能在Dockerfile本身中提到这一点呢?陷阱在于你在容器本身中失去了决定论。docker容器的一个想法是,您的图像将始终以相同的方式运行,与运行环境无关。通常,装入卷只是为了实现数据的持久性,如果应用程序中有html文件,它们实际上应该放在容器中,主要是在docker compose文件中我尝试了卷:-./src:/usr/src/app/src,但变化并非如此reflecting@ShubhamGupta启动容器时正在运行什么命令?还有,您运行的是什么系统?卷可能会有一些奇怪的行为,具体取决于运行它们的位置。打印时是否有任何错误?我首先运行docker compose build,然后使用docker compose up。我在用mac。当我尝试卷::usr/src/app时,它给出了找不到本地gulp文件的提示。当我使用Volume:./src:usr/src/app/src时。容器运行了,但并没有动态地反映更改嗯,实际上我自己无法在您的机器上运行您的配置,我不知道我能提供多少帮助。你确定你在容器中找对了文件夹吗?事情终于解决了。实际上,由于gulp-service:dist命令,我正在从发布文件夹运行应用程序。我把它改成了大口大口大口的发球,一切都正常了。谢谢你的帮助!非常感谢
    docker run ... -v $(pwd)/src:/usr/src/app ...