開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Composerのインストーラのシグネチャを検証するDockerfileの書き方
no-image

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
  • posted by もりちゃん
  • Docker
TOPに戻る