【问题标题】:How do I populate a volume in a docker-compose.yaml如何在 docker-compose.yaml 中填充卷
【发布时间】:2017-02-21 06:48:12
【问题描述】:

我开始编写我的第一个 docker-compose.yml 文件来设置组成我的应用程序的服务组合(所有 node-js)。其中一个服务(网络服务器 - 定制的,不是特快的)既有它需要的大量模块,也有更大的 bower_components 集。

为了提供关注点分离,以便我可以更紧密地控制版本控制,我想创建两个命名卷,其中包含 node_modules 和 bower_components,并将这些卷挂载到 Web 服务器服务的相关目录中。

让我困惑的问题是如何在服务启动时填充这两个卷。我的困惑有两个原因:-

  1. 带有-d 标志的docker-compose 与带有-d 标志的docker run 命令的行为 - Web 服务显然需要继续运行(如果失败,确实需要重新启动),而容器当整个应用程序使用docker-compose up 命令启动时,可能会填充一个或其他卷的运行一次。我可以控制吗?
  2. 正在运行的服务和该服务的build 命令。我真的可以使用Dockerfiles 来运行npm installbower install。特别是,如果我更改了 Web 应用程序的源代码,但模块和 bower_components 没有更改,那么此构建步骤是否会因为缓存结果而立即执行?

我一直找不到这种行为的例子,所以我不知道如何去做。有人可以帮忙吗?

【问题讨论】:

    标签: node.js docker docker-compose


    【解决方案1】:

    我在没有 Bower 的情况下做了类似的事情,但使用了 Sass、Hall、live reload、jasmine 等 nodeJS 工具...... 我在 npm 项目中使用 npm 进行所有安装(不是全局安装) 为此,官方节点映像很安静,我只需将 PATH 设置为 app/node_modules/.bin。所以我的 Dockerfile 看起来像这样(非常简单):

    FROM node:7.5
    ENV PATH /usr/src/app/node_modules/.bin/:$PATH
    

    我的 docker-compose.yml 文件是:

    version: '2'
    services:
      mydata:
      image: busybox
      stdin_open: true
      volumes:
        - .:/usr/src/app
    node:
      build: .
      image: mynodecanvassvg
      working_dir: /usr/src/app
      stdin_open: true
      volumes_from:
        - mydata
    sass:
      depends_on:
        - node
      image: mynodecanvassvg
      working_dir: /usr/src/app
      volumes_from:
        - mydata
      #entrypoint: "node-sass -w -r -o public/css src/scss"
      stdin_open: true
    jasmine:
      depends_on:
        - node
      image: mynodecanvassvg
      working_dir: /usr/src/app
      volumes_from:
        - mydata
      #entrypoint: "jasmine-node --coffee --autoTest tests/coffee"
      stdin_open: true
    live:
      depends_on:
        - node
      image: mynodecanvassvg
      working_dir: /usr/src/app
      volumes_from:
        - mydata
      ports:
        - 35729:35729
      stdin_open: true
    

    我只遇到了一些入口点问题,这些入口点都需要终端在工作时显示结果。因此,我使用 stdin_open: true 来保持容器处于活动状态,然后在每个容器上使用 docker exec -it 来运行每个监视服务。

    当然,我使用 -d 启动 docker-compose 以使其作为守护进程保持活跃。 接下来,您必须将您的 npm package.json 放在您的应用程序文件夹中(在 Dockerfile 和 docker-compose.yml 旁边)并启动 npm 更新以加载和安装模块。

    【讨论】:

      【解决方案2】:

      我先从标准的方式开始

      2。 Dockerfile

      使用 Dockerfile 可以避免尝试解决如何设置 docker-compose 服务依赖项或外部构建脚本来填充卷并在 docker-compose up 之前工作。

      可以设置 Dockerfile,因此只有更改 bower.jsonpackage.json 才会触发重新安装 node_modulesbower_components

      在某些时候,首先安装的命令必须使第二个命令缓存无效,因此您放置它们的顺序很重要。哪个更新最少,或者速度明显较慢,应该先行。如果要先运行 bower 命令,可能需要全局手动安装 bower。

      如果您担心 NPM 版本控制,请查看使用 yarnyarn.lock 文件。纱线也会加快速度。 Bower 可以只设置特定版本,因为它没有 NPM 的相同子模块版本控制问题。

      文件Dockerfile

      FROM mhart/alpine-node:6.9.5
      
      RUN npm install bower -g
      
      WORKDIR /app
      
      COPY package.json /app/
      RUN npm install --production
      
      COPY bower.json /app/
      RUN bower install
      
      COPY / /app/
      CMD ["node", "server.js"]
      

      档案.dockerignore

      node_modules/
      bower_components/
      

      这在 docker-compose build: 节中都得到了支持

      1。 Docker Compose + 卷

      填充卷的最简单/最快的方法是在图像中填充目录后在Dockerfile 中定义VOLUME。这将通过撰写工作。当图像已经具有所需的内容时,我会质疑使用卷的意义......

      任何其他的填充方法都需要一些非 compose 的自定义构建脚本。一种选择是docker run 一个附加了所需卷的容器,并用npm/bower install 填充它。

      docker run \
        --volume myapp_bower_components:/bower_components \
        --volume bower.json:/bower.json \
        mhart/alpine-node:6.9.5 \
        npm install bower -g && bower install
      

      docker run \
        --volume myapp_mode_modules:/node_modules \
        --volume package.json:/package.json \
        mhart/alpine-node:6.9.5 \
        npm install --production
      

      然后您将能够在您的应用容器上安装填充的卷

      docker run \
        --volume myapp_bower_components:/bower_components \
        --volume myapp_node_modules:/node_modules \
        --port 3000:3000
        my/app
      

      您可能还需要为卷名提出某种版本控制方案,以便您可以回滚。对于图像已经为您所做的事情,听起来像是付出了很多努力。

      或者可能查看rocker,它提供了一个替代的 docker 构建系统,让您可以执行 Docker 开发人员反对的所有事情,例如在构建期间挂载目录。这再次超出了 Docker Compose 支持的范围。

      【讨论】:

      • 谢谢 - 我已经看到了在 Dockerfile 中分层图像生成的技巧,但是在我的大脑围绕 docker-compose 时忘记了它。我认为这非常适合我的需要 - 只有一个容器包含完整的节点模块和凉亭组件堆栈,其他的都是相当琐碎的帮助服务,所以我会继续这样做。
      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 2019-06-03
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      相关资源
      最近更新 更多