另一种使用docker-compose的方式

以下Docker + Laravel =? 我想谈谈使用docker-compose实用程序的一种非常不寻常的方法。


对于初学者,对于那些不知道为什么需要docker-compose的人。 这是一个实用程序,可让您在单独的主机上运行打包在Docker容器中的一组相关服务。 初始版本是用python编写的,可以通过两种方式安装:


  • 通过操作系统的软件包管理器(对于Ubuntu来说apt install docker-compose以及对于Centos来说是yum install docker-compose.noarch
  • 通过python依赖管理器( pip install docker-compose

第一种方法的问题是通常在旧版本的docker-compose操作系统的存储库中。 如果您需要使用最新版本的docker守护程序或使用特定于docker-compose.yaml文件格式特定版本的功能,则将出现此问题(可在官方docker网站上找到按格式版本和docker-compose实用程序版本支持的功能矩阵)。


现在Docker开发人员 随时随地重写实用程序 ,这是一个错误,实际上将python脚本与环境打包在一个软件包中,并以二进制文件形式提供,这使您可以通过以下方式进行安装(这是当前推荐的方法):


  1. 我们在https://github.com/docker/compose/releases查看最新版本并下载


     $ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 

  2. 设置运行应用程序的权限


     $ sudo chmod +x /usr/local/bin/docker-compose 

  3. 此外,您可以为命令解释器bash和zsh设置自动完成功能


  4. 检查安装


     $ docker-compose --version docker-compose version 1.22.0, build 1719ceb 


我相信单个二进制文件非常酷,因为 我们不需要提取python依赖项。 是的,总的来说-也许我们的python环境在目标机器上被完全破坏了,我们要配置它!



python环境中的混淆示例


但是,还有第四条路径,我想谈一谈。 这是通过docker运行docker-compose的能力。 实际上,Docker Hub( https://hub.docker.com/r/docker/compose/ )上已经收集了官方映像。 为什么可能需要它们?


  • 如果我们想同时使用多个版本的docker-compose(尽管通常最后一个稳定版本就足够了)
  • 如果我们没有python或不想使用它(例如,我们有一个轻量级的CoreOS Container Linux发行版
  • 在CI / CD管道中使用。

试试吧!


正如我们通常启动容器一样:


 $ docker-compose up -d 

通过打包在docker容器中的实用程序:


 $ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$PWD:/rootfs/$PWD" -w="/rootfs/$PWD" docker/compose:1.13.0 up -d 

太冗长了吧? 大脑可能会断裂以记住所有这些参数。 因此,我们将尝试使生活更轻松,并使用Shell语言编写包装器。 但首先,让我们看一下传递的参数:


  • --rm停止后删除临时容器,即 我们不会在系统中留下垃圾
  • -v /var/run/docker.sock:/var/run/docker.sock如果没有此选项,则docker-compose将无法连接到主机上的docker守护进程
  • -v "$PWD:/rootfs/$PWD" -w="/rootfs/$PWD" -允许您转发容器内的当前目录,以便实用程序查看docker-compose文件

我们仍然无法插值docker-compose文件中的值。 这是实用程序用来替换YAML文件中的环境变量的过程。 例如,在一个片段中


 version: "2.1" services: pg: image: postgres:9.6 environment: POSTGRES_USER: ${POSTGRES_DB_USER} POSTGRES_PASSWORD: ${POSTGRES_DB_PASSWORD} 

变量POSTGRES_DB_USERPOSTGRES_DB_PASSWORD将从环境中读取。 这样就可以在一定程度上为docker-compose文件建立模板。 即 我们需要从主机捕获环境并将其传输到容器中。


让我们通过编写bash脚本解决问题。


 #!/bin/sh #       TMPFILE=$(mktemp) #       env > "${TMPFILE}" #        VERSION="1.13.0" #  docker-compose docker run \ --rm \ -e PWD="$PWD" \ --env-file "${TMPFILE}" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$PWD:/rootfs/$PWD" \ -w="/rootfs/$PWD" \ docker/compose:"${VERSION}" \ "$@" #         rm "{$TMPFILE}" 

其他行出现了:


  • -e PWD="$PWD" -以防万一,转发当前目录
  • --env-file "${TMPFILE}" -这里所有其他环境变量都是从主机传输的
  • docker/compose:"${VERSION}" -图像的名称,从变量中获取版本
  • "$@" -这种构造使您可以像使用docker-compose实用程序一样使用脚本,即 透明地将其参数传递给docker容器。

我们可以将脚本保存在例如/usr/local/bin/docker-compose ,在其上设置eXecute标志并使用它。 上面的脚本并非假装没有100%的错误或缺点,而是该方法的说明。


我们自己以这种方式使用CI / CD管道。 这样甚至可以在某种程度上节省一些流量。 泊坞窗目标映像是从本地缓存中获取的。

Source: https://habr.com/ru/post/zh-CN425273/


All Articles