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

akc*_*c42 5 node.js docker docker-compose

我开始编写我的第一个 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该服务的命令。我实际上可以使用 aDockerfiles来运行npm installbower install. 特别是,如果我更改了 Web 应用程序的源代码,但模块和 Bower_Components 没有更改,那么由于缓存的结果,此构建步骤是否会立即完成?

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

Mat*_*att 2

我首先从标准方式开始

2. Dockerfile

使用 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:节中得到支持

1.Docker Compose + 卷

填充卷的最简单/最快的方法是在映像中填充目录后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 支持的范围。