以下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脚本与环境打包在一个软件包中,并以二进制文件形式提供,这使您可以通过以下方式进行安装(这是当前推荐的方法):
我们在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
设置运行应用程序的权限
$ sudo chmod +x /usr/local/bin/docker-compose
此外,您可以为命令解释器bash和zsh设置自动完成功能
检查安装
$ 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 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_USER
和POSTGRES_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管道。 这样甚至可以在某种程度上节省一些流量。 泊坞窗目标映像是从本地缓存中获取的。