如何在docker-compose.yaml中填充卷

时间:2017-02-21 06:48:12

标签: node.js docker docker-compose

我开始编写我的第一个docker-compose.yml文件来设置组成我的应用程序的服务组合(所有node-js)。其中一项服务(web-server-bespoke,not express)既有大量需要的模块,也有更大的bower_components。

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

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

  1. 带有docker-compose标志的-d与带有docker run标志的-d命令的行为 - Web服务显然需要继续运行(确实需要保持运行)如果失败则重新启动)而可能填充一个或另一个卷的容器是一次运行,因为整个应用程序使用docker-compose up命令启动。我能控制一下吗?
  2. 正在运行的服务和该服务的build命令。我实际上可以使用Dockerfiles来运行npm installbower install。特别是,如果我更改了Web应用程序的源代码,但模块和bower_components没有改变,那么由于缓存结果,这个构建步骤是否会立即生效?
  3. 我一直无法找到这种行为的例子,所以我很困惑如何去做。有人可以帮忙。

2 个答案:

答案 0 :(得分:1)

我先从标准方式开始

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 + Volumes

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

任何其他人口方法都需要在撰写之外的一些自定义构建脚本。一个选项是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所支持的范围。

答案 1 :(得分:0)

在没有凉亭的情况下我做了类似的事情,但是使用了像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放在app文件夹(Dockerfile和docker-compose.yml旁边)上,然后启动npm update以加载和安装模块。