命名Docker卷以共享构建而不更新

肖恩

我正在工作的公司的开发运营人员曾问我,要在Docker上做一些不同的事情,然后我也会被使用。目标是拥有2个容器,其职责如下:

容器A:将构建前端react应用程序并将其放入名为的目录中的节点容器app/dist/完成后,容器将停止运行。

容器B:一个高山的nginx容器,它将从中托管静态文件/usr/share/nginx/html/app

其中已建成的容器中的文件将使用体积将挂载提供给容器B<Container A>/app/dist<Container B>/usr/share/nginx/html/app

请注意,公共可访问端口和nginx容器之间有一个HAProxy层,称为app

正在使用docker compose文件整理以上任务,该文件如下所示:

version: '2'
volumes:
  webapp_build_volume: {}
services:
  webapp_build:
    build:
      context: .
      dockerfile: 'config/nginx/dockerfile-builder'
    volumes:
      - webapp_build_volume:/app/dist
      - webapp_static_volume:/app/src/app/static
  app:
    build:
      context: 'config/haproxy'
      dockerfile: 'dockerfile-app-haproxy'
    links:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - '80:80'
      - '1936:1936'
  web:
    build:
      context: .
      dockerfile: 'config/nginx/dockerfile-web'
    environment:
      - EXCLUDE_PORTS=443
      - VIRTUAL_HOST=*
    depends_on:
      - webapp_build
    volumes:
       - webapp_build_volume:/usr/share/nginx/html/app

当前仅在第一次构建docker compose文件时有效。创建卷后,该卷中的文件不再更新。我已经读到已建立的命名卷无法更新,但我无法确认。我发现了涉及运行的变通方法,docker-compose rm --force && docker volume webapp_build rm但由于CI服务将变得太慢,因此我希望不必杀死缓存的容器(如果可能)。

请让我知道是否可以澄清任何事情(我知道这里有很多活动部件)。请注意,我也正在使用docker 2 beta,尽管我看不到这会如何改变我在这里所做的任何事情。

米奇

这有点难以理解,但是听起来好像您正在构建映像,将文件输出到您认为是卷的文件中,然后尝试使用该文件来填充另一个正在运行的容器使用的命名卷。

您最有可能感到困惑的是,构建容器不会装入卷,而只能将卷装入正在运行的容器中。命名卷确实具有一项功能,可以用图像的内容填充该卷,但仅当您挂载一个空的命名卷时才可以。看来您在第一次构建和运行时就利用了此功能,但在以后的构建中将不再起作用。如果您在没有卷的情况下运行构建容器,则会发现文件位于预期的位置。

您可以轻松更新命名卷。我想到两个选择。一种是使用您当前的过程,但是将卷挂载点更改为“ / target”CMD之类的内容,并作为您的构建容器,将源内容复制到“ / target”。看起来像:

Docker文件

...
RUN compile-cmd --output-to /local/build/dir

entrypoint.sh:

cp -a /local/build/dir/* /target/

docker-compose.yml:

version: '2'
services:
  webapp_build:
    build:
      context: .
      dockerfile: 'config/nginx/dockerfile-builder'
    volumes:
      - webapp_build_volume:/target
...

第二个选择是根本不在容器构建中执行此操作,而是使用应用程序编译先决条件创建一个容器。然后使用或将您的应用程序代码作为卷装入此容器中,该容器使用CMDENTRYPOINT来接收代码卷内容,对其进行编译,然后将其输出到也已装入的命名卷中。然后,您无需构建构建容器,而只需运行已安装两个卷的编译容器即可。

entrypoint.sh:

compile-cmd --input-src=/source --output-to /target

docker-compose.yml:

version: '2'
services:
  webapp_build:
    volumes:
      - app/source:/source
      - webapp_build_volume:/target
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Docker命名卷未更新

来自分类Dev

Docker命名卷未更新

来自分类Dev

如何创建与主机共享的数据的命名Docker数据卷

来自分类Dev

docker 与 glusterfs 共享卷

来自分类Dev

在云构建步骤中安装 google-chrome 不跨步骤共享(使用卷)

来自分类Dev

从数据容器更新共享卷

来自分类Dev

在Docker容器之间共享卷

来自分类Dev

Docker 与远程机器共享卷

来自分类Dev

从多个主机共享 docker 卷?

来自分类Dev

通过Vagrant在Docker中共享卷

来自分类Dev

Docker mongodb与Mac OS X共享卷

来自分类Dev

docker-compose删除共享卷

来自分类Dev

Docker使用卷共享环境变量

来自分类Dev

Docker Permissios在Mac上共享卷

来自分类Dev

使用 Docker Swarm 定义共享主机卷

来自分类Dev

docker 中的共享镜像卷挂载错误

来自分类Dev

Docker命名卷与DOC(仅数据容器)

来自分类Dev

Docker-compose命名挂载卷

来自分类Dev

Docker在多个容器之间命名卷

来自分类Dev

Windows的Docker:访问命名的卷安装

来自分类Dev

Docker构建与主机共享数据

来自分类Dev

Docker:使用Docker Toolbox在Windows上共享卷

来自分类Dev

使用docker-compose创建命名的docker卷?

来自分类Dev

共享模块变量不更新?

来自分类Dev

将NFS目录挂载到与Docker共享的主机卷中

来自分类Dev

Docker数据卷容器-我可以在整个群集间共享

来自分类Dev

docker-组成服务之间的共享卷

来自分类Dev

跨多个docker-compose项目共享卷

来自分类Dev

将NFS目录挂载到与Docker共享的主机卷中