「dockerは動くがdocker-composeが動かない」というおもしろい環境のデバッグを手伝っていた際にdockerの公式ドキュメントを読んで、コンテナとしてdocker-composeを動かす方法が紹介されていて、とてもdockerっぽくて面白いなと思った。
Docker Compose のインストール — Docker-docs-ja 17.06.Beta ドキュメント
仕組み
公式ドキュメントで紹介されている docker-composeのラッパースクリプト を読んでいくと、docker-composeのバイナリを積んだコンテナイメージが用意されていて、そのコンテナにdocker.sock渡して、コンテナ内からdocker-compose.yamlで指定されたコンテナを起動させているようだ。
そして、そのラッパーとなるshell scriptを /usr/local/bin/docker-compose
へ置くことで、さもそのホストへdocker-composeコマンドがインストールされているかのように使うことができる。
懸念: コンテナへdocker.sockを渡して大丈夫か?
docker.sockを不用意にコンテナへ渡すとホストのrootを取られうるのでとても危険だが、docker公式が提供するイメージなのでその心配は無用だろう。
Dockerコンテナ内からホストマシンのルートを取る具体的な方法(あるいは/var/run/docker.sockを晒すことへの注意喚起) | 48JIGEN *Reloaded*
注意: ドキュメント通りのURLからrun.shをダウンロードすると、古い
公式日本語ドキュメントでは下記からrun.shをダウンロードするような紹介がされている
https://github.com/docker/compose/releases/download/1.6.2/run.sh
が、そのスクリプトで動くdocker-composeは1.6.2、つまり2016年2月頃のバージョンだ。 docker-composeには新しい機能がどんどん取り入れられているので、できる限り新しいバージョンを使ったほうが良い。
最新のrun.shはgithubからダウンロードできる。
Releases · docker/compose · GitHub
本日 (2018/9/4) 時点での最新版は 1.22.0。リリースノートは下記。