繁体   English   中英

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

[英]How do I populate a volume in a docker-compose.yaml

我开始编写我的第一个docker-compose.yml文件,以设置构成我的应用程序的服务组合(所有node-js)。 其中一项服务(网络服务器-定制,不表达)具有所需的大量模块和更大的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不变,那么由于缓存了结果,此构建步骤是否可以立即进行?

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

我先从标准方法开始

2. Dockerfile

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

可以设置bower.json ,以便仅更改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:支持所有这些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支持的范围。

我做了一些类似的事情,没有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更新以加载和安装模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM