我开始编写我的第一个docker-compose.yml文件来设置组成我的应用程序的服务组合(所有node-js)。其中一项服务(web-server-bespoke,not express)既有大量需要的模块,也有更大的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没有改变,那么由于缓存结果,这个构建步骤是否会立即生效?我一直无法找到这种行为的例子,所以我很困惑如何去做。有人可以帮忙。
答案 0 :(得分:1)
我先从标准方式开始
使用Dockerfile可以避免尝试设置如何设置docker-compose服务依赖项或外部构建脚本以在docker-compose up
之前填充和填充卷。
可以设置Dockerfile,因此只有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:
节
填充卷的最简单/最快捷的方法是在映像中填充目录后在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以加载和安装模块。