この記事はCircleCI2.0環境でPHPの拡張機能をインストールする際、エラーでビルドが停止してしまう現象を何とか回避する手順です。
- 2018/11/19 原因が判明したため解決方法を追記しました
現象
CircleCIの設定ファイルであるconfig.ymlを全くさわっていないにもかかわらず、直前まで通っていたビルドが一切通らなくなってしまいました。
エラーは以下のような内容が出力されます。
$ sudo docker-php-ext-install pdo_mysql
・・・
/usr/local/bin/docker-php-ext-enable: 108: /usr/local/bin/docker-php-ext-enable: cannot create /conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent
原因はまだ分かっておらず、根本的な解決にはなりませんがとりあえずの解決策として以下の対応を実行します。
どうやらdocker-libraryのphpモジュールが修正された際、sudoでは一部環境変数が引き継がれずディレクトリパスが見つからなくなっていたようです。
- Docker build on circle CI failed: cannot create /conf.d/docker-php-ext-mcrypt.ini: Directory nonexistent
- Fix hardcoded ini dir #740
対応(追記)
原因が判明して問題の解決方法がわかったので、イメージの固定ではなく環境変数の引き継ぎで対応します。
環境変数を引き継ぐために sudo
コマンドに -E
オプションを追加して実行するだけです。
$ sudo -E docker-php-ext-install pdo_mysql
これでイメージを固定しなくてもよくなり、すっきりビルドが通るようになりました。
仮対応
原因が判明して問題が解決した今、こちらの対応は一時しのぎですが一応残しておきます。
最後に成功したビルドのイメージIDを探す
まずCircleCIのビルドログを確認します。
確認するのは一番最初の Spin up Environment
の実行ログです。
実行ログの最後の方にsha256のハッシュが記載されているので、これをメモします。
Status: Downloaded newer image for circleci/php:7.1-apache-jessie-node-browsers
using image
circleci/php@sha256:{hash}
インストールするイメージを固定する
config.ymlに先ほど取得したハッシュを使用して、インストール時に使用されるイメージを固定します。
version: 2
jobs:
build:
docker:
- image: circleci/php:7.1-apache-jessie-node-browsers@sha256:{先ほど取得したハッシュ値}
これで再度ビルドを通すと無事最後まで完走しました。