[英]how can i guarantee docker host volume have the right permission after multiple `docker-compose up` & `docker-compose-down`
[英]How do I populate a volume in a docker-compose.yaml
我开始编写我的第一个docker-compose.yml文件,以设置构成我的应用程序的服务组合(所有node-js)。 其中一项服务(网络服务器-定制,不表达)具有所需的大量模块和更大的bower_components集。
为了提供关注点分离,以便我可以更紧密地控制版本控制,我想创建两个命名卷,其中包含node_modules和bower_components,并将这些卷安装到Web服务器服务的相关目录上。
使我困惑的问题是如何在服务启动时填充这两个卷。 我感到困惑的原因有两个:
docker-compose
与-d
标志兑docker run
使用命令-d
标志- Web服务显然需要保持运转(实际上是需要重新启动,如果它失败),而这可能填充容器中的一个或其他卷一次运行一次,因为使用docker-compose up
命令启动了整个应用程序。 我可以控制吗? build
命令。 我是否可以实际使用Dockerfiles
运行npm install
和bower install
。 特别是,如果我更改了Web应用程序的源代码,但是模块和bower_components不变,那么由于缓存了结果,此构建步骤是否可以立即进行? 我一直找不到这种行为的例子,所以我对如何去做感到困惑。 有人可以帮忙吗?
我先从标准方法开始
使用Dockerfile可以避免尝试弄清楚如何设置docker-compose服务依赖项或外部构建脚本来填充卷并在docker-compose up
之前工作。
可以设置bower.json
,以便仅更改bower.json
和package.json
会触发重新安装node_modules
或bower_components
。
尽管某些时候,首先安装的命令将不得不使第二个命令缓存无效,因此将它们放入命令的顺序很重要。 更新最少或速度较慢的哪个应该优先。 如果要首先运行bower
命令,则可能需要在全局范围内手动安装bower。
如果您担心NPM版本控制,请考虑使用yarn和yarn.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:
节
填充卷最简单/最快捷的方法是在映像中填充目录之后,在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.