背景
PHP Docker

Composerのインストーラのシグネチャを検証するDockerfileの書き方

こんにちは、ナカエです

DockerfileにComposerのインストール処理をシグネチャ検証付きで書こうとして若干はまったので覚書です。 Composer公式のDownloadのページにあるインストールのコマンドがこちらです。


php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'aa96f26c2b67226a324c27919f1eb05f21c248b987e6195cad9690d5c1ff713d53020a02ac8c217dbf90a7eacc9d141d') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

上記スクリプトを実行するとインストーラのファイルのハッシュが正しいかどうかを検証してからインストールされるわけですが、このファイルのハッシュ値が固定値じゃないんですよね。

このままDockerfileに記述するとインストーラのコードが変わった際にビルドが失敗するようになります。残念!

自動インストールのためのシェルスクリプト

ぐぬぬ……となるわけですが、Downloadのページをよく見ると、How to install Composer programmatically?というリンクが見つかります。 こちらに自動インストール用のシェルスクリプトが記載されています。

Dockerfileにインラインで書きたい

これでめでたしめでたし……と思ったのですが、Dockerfileにこれをそのまま書けるか?というところで再び詰まりました。

シェルスクリプトのif文などを省くために、同じ処理をPHPコードで代行すれば無事になんとかなりました。

RUN php -r "copy('https://getcomposer.org/installer', '/tmp/composer-setup.php');" \
  && php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') !== trim(file_get_contents('https://composer.github.io/installer.sig'))) { echo 'ERROR: Invalid installer signature' . PHP_EOL; unlink('/tmp/composer-setup.php'); exit(1); }" \
  && php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer  && rm -rf /tmp/composer-setup.php
≪ フレームワークを使わないでmigrationの導入③  | 

Web制作のお問い合わせ

075-744-6842

(平日/土曜 10:00~17:00)

 お問い合わせ