dorivenの日記

気がついたら社会人。気になる技術的なことについて少しずつ書いていけたらと思っております。

dockerのcomposerコンテナでpackagist.jpを使う方法

phpやcomposer周りはコンテナを活用しているが、packagist.orgを使っていると日が暮れてしまう。
公式のcomposerコンテナでpackagist.jpを使う方法を調べたのでここに記載する。

TL;DR;

すでにホストOS側でpackagist.jpを使う設定をしている場合 - composer home(特に設定していなければ ~/.composer )を/tmpにマウントすればよい。 - dockerコマンドであれば -v ~/.composer:/tmp オプションを付与すれば良い。

設定がされていない場合 - packagist.jpを設定したあとに任意のコマンドを叩けるbashスクリプトを用意 - Dockerビルドしてentrypointに設定するなり、直接bashから叩くようにしてあげれば良い

やり方

すでにホストOSでcomposerにpackagist.jpが設定されている場合

composerコンテナは/tmpがcomposer homeとして設定されている。
そのためホストOSのcomposer home(特に設定していなければ ~/.composer )を/tmpにマウントすればよい。

具体例

dockerコマンドであれば -v ~/.composer:/tmp オプションを付与する。

メインがPHPのレポジトリでcomposer.jsonがレポジトリのrootに置いてあるのであれば以下のようなdockerコマンドを叩けば良い。

docker run --rm -v $(pwd):/app -v ~/.composer:/tmp -w /app composer:latest composer

docker-composeを利用するのであれば以下のように記載する。

...

composer:
  image: composer:latest
  volume:
    - ~/.composer:/tmp

...

設定されていない場合

実行時に都度packagist.jpを設定するように変更してあげれば良い。

元のエントリーポイントにpackgist.jpを設定するコードを一行追加するだけ。

#!/bin/sh

isCommand() {
  # Retain backwards compatibility with common CI providers,
  # see: https://github.com/composer/docker/issues/107
  if [ "$1" = "sh" ]; then
    return 1
  fi

  composer help "$1" > /dev/null 2>&1
}

# check if the first argument passed in looks like a flag
if [ "${1#-}" != "$1" ]; then
  set -- /sbin/tini -- composer "$@"
# check if the first argument passed in is composer
elif [ "$1" = 'composer' ]; then
  set -- /sbin/tini -- "$@"
# check if the first argument passed in matches a known command
elif isCommand "$1"; then
  set -- /sbin/tini -- composer "$@"
fi

# ここに1行足しただけ
composer config -g repositories.packagist composer https://packagist.jp

exec "$@"

これを適当にbashファイルとして起こして上げて、コンテナをビルドしてあげるなりbashファイルを実行するなりしてあげれば良い。

例えば上記のファイルを deco_entry.bash という名前で同一階層に置いたとするなら、
こんな感じで叩く(bash deco_entry.bashの後ろに叩きたいcomposerコマンドで叩く)とわざわざコンテナをビルドしなくても使える。

$ docker run --rm -v $(pwd):/app -w /app composer:latest bash deco_entry.bash composer install

packagist.jpでちゃんと設定されている。

$ docker run --rm -v (pwd):/app -w /app composer:latest bash deco_entry.bash composer config -g --list | grep packagist.org.url
[repositories.packagist.org.url] https://packagist.jp

終わり

これでcomposerコンテナを使うときはpackagist.jpを使って爆速で初期セットアップを終わらせられるようになる。