Chapter 03

プロジェクトで使う

この章で理解できること

Docker のコマンドとDockerfileの基本を理解したので、プロジェクトでの共有を主軸に Composer のインストールとエディタ設定について確認します。

この章で理解できることを、先に整理します。

対象 Git 管理
Dockerfile する
composer.json する
Composer 直接はしないがDockerfileで共有する
vendor/ 直接はしないがDockerfilecompsoer.jsonで共有する

ほかの要点のまとめです。

  • Bind Mount を使い、ホストマシンのディレクトリとコンテナのディレクトリを共有できる
  • エディタで指定する実行ファイルは、リモートのものを指定できる

上記の理解を整理した絵はこの通りです。

名前がややこしいですが、Composer ( composer xxx ) と Docker Compose ( docker-compose xxx ) は関係ありません。

Composer は PHP のパッケージ管理ツールであり、Java における Maven / Gradle とか Ruby における Gem とか Node.js における NPM に相当するものです。

この章では Docker Compose は出てきません。

Git 管理する

Dockerfileは当然 Git 管理をして、メンバーと共有します。

vendor/は Composer でインストールしたモジュールが入る場所でvendor/bin/phpunitなどを含みますが、容量が大きいしcomposer.jsonから再現が可能なため、vendor/自体は Git 管理から外します。

Composer 自体は、インストール方法とバージョンをプロジェクトで共有したいので、Composer を実行するコンテナを用意することにします。

Dockerfile を複数使う

PHP のコンテナと Composer のコンテナは別で用意します。

コンテナは 1 プロセス 1 コンテナが基本であるというのと、composer installの実行などが本番環境では不要だという理由からです。

docker/cli/Dockerfiledocker/composer/Dockerfileを別で用意します。

php のイメージはphp-sandbox:cliと実質同じです。

docker/cli/Dockerfile
FROM centos:centos7

LABEL desc="php-sandbox cli"

RUN yum install -y epel-release                                                && \
    yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \
    yum update -y                                                              && \
    yum install -y --enablerepo=remi-php80 php

Composer のイメージはかなり不恰好ですが、PHP を同じ方法で入れてからさらに Composer をインストールすることにします。

docker/composer/Dockerfile
FROM centos:centos7

LABEL desc="php-sandbox composer"

RUN yum install -y epel-release                                                && \
    yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \
    yum update -y                                                              && \
    yum install -y --enablerepo=remi-php80 php

RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --version=2.0.11 --install-dir=/usr/bin/ --filename=composer && \
    yum install -y git zip

今回の目的は環境構築ではなく理解なので、Composer のコンテナ作成はこれで済ませます。

興味のある方はマルチステージビルドについて調べてみてください。

参考: Docker に Composer をインストールするベストプラクティス(と解説) - Qiita

RUNの結果が Linux の AND 演算子 ( && ) で繋がっているのは、コストなどの観点で推奨されるDockerfileのプラクティスです。

興味のある方はレイヤーについて調べてみてください。

Composer でインストールするライブラリを指定するcomposer.jsonも用意しておきます。

composer.json
{
  "name": "php-sandbox/simple",
  "description": "php sandbox",
  "require": {
    "phpunit/phpunit": "^9"
  }
}

結果的に、ホストマシンはこの様になってるはずです。

$ tree --charset=C .
.
|-- composer.json
|-- docker
|   |-- cli
|   |   `-- Dockerfile
|   `-- composer
|       `-- Dockerfile
`-- src
    `---Foo.php

docker buildしましょう。

$ docker build -t php-sandbox:cli -f docker/cli/Dockerfile .
$ docker build -t php-sandbox:composer -f docker/composer/Dockerfile .

イメージが 2 つできました

$ docker image ls
REPOSITORY         TAG               IMAGE ID       CREATED         SIZE
php-sandbox        cli               57df689f8af6   7 minutes ago   807MB
php-sandbox        composer          d308d2e7e17d   8 minutes ago   743MB

docker runでインストールしたもののバージョンだけ見ておきます。

$ docker run -it php-sandbox:cli php --version
PHP 8.0.3 (cli) (built: Mar  2 2021 16:37:06) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
$ docker run -it php-sandbox:composer composer --version
Composer version 2.0.11 2021-02-24 14:57:23

Bind Mount でホストマシンのエディタとコンテナでコードを共有する

composer.jsonを使ってcomposer installを実行したいですが、Composer はコンテナの中にインストールしてありcomposer.jsonはホストマシンにあります。

Dockerfile COPYを使ってcomposer.jsonをイメージに入れておくことは可能ですが、コンテナでcomposer installをしてもvendor/はコンテナの中にできるだけです。

compsoer.jsonvendor/をホストマシンのエディタで触りつつ Composer コンテナでcomposer installをするためには、-v dir:dirBind Mount を行いホストマシンとコンテナでディレクトリを共有します。

$ docker run -it -v $(pwd):/sync php-sandbox:composer

# cd sync

# ls
composer.json    docker    src

# composer install
:
:
:

# ls
composer.json    docker    src    vendor

# exit

$ ls
composer.json    docker    src    vendor

ホストマシン ( $ ) のカレントディレクトリとコンテナ ( # ) のsync/が共有されているので、コンテナで作ったvendor/をホストマシンで確認できました。

エディタのプラグインでホストマシンからコンテナの実行ファイルを使う

IntelliJ の PHP パス指定で、ローカルのパスではなくリモートのパスを指定します。[1]

ちゃんと PHP が8.0.3として認識されています。[2]

Composer もリモートのパスを指定することができ、実はこれで IntelliJ からcomposer installができる様になります。

PHPUnit はvendor/bin/に入っているので、普通にローカルパスを指定して設定すれば大丈夫です。

整理: この章のまとめ

冒頭のまとめを再掲します。

対象 Git 管理
Dockerfile する
composer.json する
Composer 直接はしないがDockerfileで共有する
vendor/ 直接はしないがDockerfilecompsoer.jsonで共有する
  • Bind Mount を使い、ホストマシンのディレクトリとコンテナのディレクトリを共有できる
  • エディタで指定する実行ファイルは、リモートのものを指定できる

脚注
  1. PHP Docker というプラグインが必要でした ↩︎

  2. 僕のホストマシンはphp --version7.1.23となります ↩︎