我正在对我们的开发环境进行 Docker 化。该应用程序包括一个公开 REST API 的 Laravel 应用程序。身份验证是通过 Laravel Passport 完成的。
由于这仅适用于开发人员,因此我正在安装 Composer 依赖项、设置应用程序加密密钥、迁移数据库并在运行时设置护照密钥。除了护照钥匙之外,一切都已正确初始化。无论我如何尝试解决这个问题,我最终都会遇到以下错误:
fpm_1 |在 CryptKey.php 第 45 行:
fpm_1 |
fpm_1 | 密钥路径“file:///var/www/html/storage/oauth-public.key”不存在或
fpm_1 | 不可读
这是我的 docker-compose 文件的相关部分。
version: '3'
services:
fpm:
build: ./api/docker/fpm
restart: unless-stopped
volumes:
- ./api:/var/www/html
- /etc/passwd:/etc/passwd
user: "${UID}:${GID}"
我的 fpm dockerfile (./api/docker/fpm/Dockerfile)
FROM php:7.2.6-fpm
COPY ./init-app.sh /usr/local/bin/
COPY ./install-composer.sh /usr/local/bin/
RUN apt-get update && apt-get install -y --no-install-recommends libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev libpng-dev \
libzip-dev \
libzip4 \
git \
zip \
wget \
&& apt-get autoremove \
&& apt-get clean \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-ext-configure zip --with-libzip=/usr/include/ \
&& docker-php-ext-install zip \
&& docker-php-ext-install pdo_mysql \
&& chmod +x /usr/local/bin/init-app.sh \
&& chmod +x /usr/local/bin/install-composer.sh \
&& /usr/local/bin/install-composer.sh \
&& rm /usr/local/bin/install-composer.sh \
&& wget https://raw.githubusercontent.com/vishnubob/wait-for-it/8ed92e8cab83cfed76ff012ed4a36cef74b28096/wait-for-it.sh \
&& chmod +x wait-for-it.sh \
&& mv wait-for-it.sh /usr/local/bin/
ENTRYPOINT [ "/usr/local/bin/init-app.sh" ]
CMD ["php-fpm"]
install-composer.sh 在构建时将 Composer 安装到容器中。
init-app.sh:
#!/bin/sh
set -e
# Install composer dependencies
composer install
# Copy env file
cp .env.example .env
# Wait for DB to be up
/usr/local/bin/wait-for-it.sh db:3306 -t 0 --strict -- php artisan key:generate && php artisan migrate:refresh --seed
php artisan passport:install
# Run upstream entrypoint
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- php-fpm "$@"
fi
exec "$@"
当我在 .zshrc 中导出 $UID 和 $GID 时,我的用户在 fpm 容器内正确映射。注释掉 init-app.sh 中的 Passport:install 行,以便让容器正确启动,我可以通过运行 docker exec -it php artisan Passport:install 来生成密钥。但是让容器处理它失败了。
事实证明,我的数据库播种者之一以某种方式需要密钥存在。在我调查时,我通过交换说明(播种和护照密钥安装)解决了问题
你能帮我解决这个话题吗?
当我在 docker Passport 上部署 laravel 项目时,客户端令牌未经授权。