我正在工作的公司的开发运营人员曾问我,要在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
...
第二个选择是根本不在容器构建中执行此操作,而是使用应用程序编译先决条件创建一个容器。然后使用或将您的应用程序代码作为卷装入此容器中,该容器使用CMD
或ENTRYPOINT
来接收代码卷内容,对其进行编译,然后将其输出到也已装入的命名卷中。然后,您无需构建构建容器,而只需运行已安装两个卷的编译容器即可。
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] 删除。
我来说两句