概要
dockerで、laravelでphp artisan tinker
を使ったらエラー発生した。
HOMEディレクトリに関係するエラーが発生したので、調べたことをメモしておく。
発生したエラーについて
コマンド実行するとHOMEディレクトリに.config
フォルダを作成する。
そのため、パーミッションエラーとなったようです。
$ docker-compose exec php php artisan tinker
ErrorException : Writing to /var/www/.config/psysh is not allowed.
at /var/www/www.example.com/vendor/psy/psysh/src/ConfigPaths.php:228
224| @\mkdir($dir, 0700, true);
225| }
226|
227| if (!\is_dir($dir) || !\is_writable($dir)) {
> 228| \trigger_error(\sprintf('Writing to %s is not allowed.', $dir), E_USER_NOTICE);
229|
230| return false;
231| }
232|
実行ユーザーをwww-dataユーザー
に変更していた。
しかし、HOMEディレクトリの所有者は、rootユーザー
のままだったことが原因でした。
HOMEディレクトリを定義する
Dockerfileで、HOMEディレクトリを設定する。
※ ついでなのでプロンプトの表示も変更してみた...
FROM php:7.3-fpm
ARG USER="www-data"
ARG UID="1000"
ARG GROUP="www-data"
ARG GID="1000"
...
# create user & group
RUN usermod -u $UID $USER && groupmod -g $GID $GROUP
# ↓ ここ追加!! ( create home directory )
ARG HOME_DIR='/var/www'
RUN mkdir -p $HOME_DIR
RUN chown -R $UID:$GID $HOME_DIR
# application directory
ARG APP_DIR='/var/www/www.example.com'
RUN mkdir -p $APP_DIR
RUN chown -R $UID:$GID $APP_DIR
# change user ( root -> www-data )
USER $USER
# ↓ ここ追加!! - 環境変数を設定する ( printenv HOME )
ENV HOME $HOME_DIR
# ↓ ここ追加!! - プロンプト表示を変更する ( create .bashrc )
RUN { \
echo 'export PS1="${debian_chroot:+($debian_chroot)}\u@\[\e[1;33m\]\w\[\e[m\] $"'; \
echo ''; \
} >> $HOME_DIR/.bashrc
...
動作確認
修正して再度ビルドして再起動 & tinkerコマンドを実行してみました。
$ docker-compose exec php php artisan tinker
Psy Shell v0.9.12 (PHP 7.3.29 — cli) by Justin Hileman
>>> Hash::make('HogeFuga123456');
=> "$2y$10$6RS1EnIBSsHLMy/K02URCeB4QLsti1f53pkLb2px1lqXt34bRZvYa"
>>> exit
Exit: Goodbye
問題ないようです。
参考サイト
- Github - docker-library/php
- 環境変数の一覧を表示するには
- DockerfileでPATHを通す時はRUNではなくENVを使おう
- Bashプロンプトの変更
- Laravelのtinkerを使えるとちょっと幸せになれる
以上