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