akc*_*c42 5 node.js docker docker-compose
我开始编写我的第一个 docker-compose.yml 文件来设置组成我的应用程序的服务组合(所有 Node-js)。其中一个服务(网络服务器 - 定制的,而不是快速的)既有它需要的大量模块,也有更多的 Bower_components。
为了提供关注点分离,以便我可以更紧密地控制版本控制,我想创建两个保存 node_modules 和 Bower_components 的命名卷,并将这些卷安装到 Web 服务器服务的相关目录中。
让我困惑的问题是如何在服务启动时填充这两个卷。我的困惑有两个原因:-
docker-compose使用该-d标志与docker run使用该标志的命令的行为-d- Web 服务显然需要保持运行(如果失败,确实需要重新启动),而可能填充一个或另一个卷的容器只运行一次,因为整个应用程序是通过命令启动的docker-compose up。我能控制这个吗?build该服务的命令。我实际上可以使用 aDockerfiles来运行npm install和bower install. 特别是,如果我更改了 Web 应用程序的源代码,但模块和 Bower_Components 没有更改,那么由于缓存的结果,此构建步骤是否会立即完成?我一直无法找到这种行为的例子,所以我很困惑如何去做。有人可以帮忙吗。
我首先从标准方式开始
使用 Dockerfile 可以避免尝试弄清楚如何设置 docker-compose 服务依赖项或外部构建脚本以在docker-compose up.
可以设置 Dockerfile,因此仅对bower.json和进行更改就会触发或package.json的重新安装。node_modulesbower_components
在某些时候,首先安装的命令必须使第二个命令缓存无效,因此您放置它们的顺序很重要。更新最少或速度明显慢的应该先更新。如果您想先运行该命令,您可能需要手动全局安装 Bower bower。
如果您担心 NPM 版本控制,请考虑使用纱线和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"]
Run Code Online (Sandbox Code Playgroud)
文件.dockerignore
node_modules/
bower_components/
Run Code Online (Sandbox Code Playgroud)
这一切都在 docker-composebuild:节中得到支持
填充卷的最简单/最快的方法是在映像中填充目录后VOLUME定义a。Dockerfile这将通过 compose 来实现。当图像已经具有所需的内容时,我会质疑使用卷的意义......
任何其他填充方法都需要在 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
Run Code Online (Sandbox Code Playgroud)
和
docker run \
--volume myapp_mode_modules:/node_modules \
--volume package.json:/package.json \
mhart/alpine-node:6.9.5 \
npm install --production
Run Code Online (Sandbox Code Playgroud)
然后您将能够将填充的卷安装到您的应用程序容器上
docker run \
--volume myapp_bower_components:/bower_components \
--volume myapp_node_modules:/node_modules \
--port 3000:3000
my/app
Run Code Online (Sandbox Code Playgroud)
您可能还需要为卷名称提出某种版本控制方案,以便可以回滚。听起来像是为了一张图片已经为你做的事情付出了很大的努力。
或者可以看看rocker,它提供了一个备用的 docker 构建系统,并允许您执行 Docker 开发人员反对的所有操作,例如在构建期间安装目录。这又超出了 Docker Compose 支持的范围。
| 归档时间: |
|
| 查看次数: |
6511 次 |
| 最近记录: |