何があった?
題名の通り、事前にcomposer専用imageを作り、それをLaravelのbuildに組み込もうとしたらPermission deniedが起きました。
Dockerfileとエラーはそれぞれ下記のようになっていました。
Dockerfile(composer)
FROM php:7.4-fpm
WORKDIR /usr/local/bin/composer
RUN apt-get update && apt-get install -y \
git \
zip \
unzip \
&& curl -sS https://getcomposer.org/installer | php
Dockerfile(Laravel)
FROM php:7.4-fpm
COPY ./src /var/www/html
WORKDIR /var/www/html
COPY --from=composer:latest /usr/local/bin/composer /usr/local/bin/composer
RUN apt-get update && apt-get install -y \
git \
zip \
unzip \
&& composer install
RUN php artisan cache:clear \
&& php artisan config:clear \
&& php artisan route:clear \
&& php artisan view:clear
RUN chown -R www-data:www-data storage
エラー
% docker-compose build #buildコマンドを叩いた
mysql uses an image, skipping
nginx uses an image, skipping
Building php
[+] Building 171.6s (12/14)
=> [internal] load build definition from Dockerfile 0.0s
〜成功部分は省略〜
#10 175.1 Processing triggers for libc-bin (2.28-10) ...
#10 175.1 /bin/sh: 1: composer: Permission denied #ここでエラーが発生し中断
------
executor failed running [/bin/sh -c apt-get update && apt-get install -y git zip unzip && composer install]: exit code: 127
ERROR: Service 'php' failed to build
#↑エラー文
%
原因
今回の件はPermission deniedは根本原因ではなく、composerコマンドが使えない状態でcomposerのimageを作成してしまったことが真の原因でした。
(エラー文だけ見るとchmod -R a+x /usr/local/bin/composer
のような権限コマンドをDockerファイルに書き込めば直るように見えてしまいますが、それをしても解決に至りません。 )
ちなみにPermission deniedはcomposerコマンドがないため、/bin/sh の中からコマンドを探そうとしたとき権限で弾かれたときのものだと予想されます。
解決方法
Dockerfile(composer)のディレクトリとファイル名を使用できるようにmvコマンドを下記のように追記し、その後composerのimageを作り直してから再度Laravelのbuildを行うことで無事buildを行うことができました。
Dockerfile(composer)
FROM php:7.4-fpm
WORKDIR /var/www/html #不要なディレクトリを作らないように変更した
RUN apt-get update && apt-get install -y \
git \
zip \
unzip \
&& curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer #追記した