我有这个简单的 shell 脚本来在 Docker 中启动 Laravel 应用程序:
#!/bin/sh
set -ex
# generate the key if it does not already exist
case `grep APP_KEY .env | sed -e 's/APP_KEY=\s*//'` in
'base64:'*)
echo "artisan key already exists...";;
*)
echo "generating artisan key..."
php artisan key:generate;;
esac
# create or update database
echo "create or update database..."
php artisan migrate --force
echo "starting server"
exec "/usr/local/bin/php artisan serve --host=0.0.0.0"
php artisan migrate
行工作正常,因此 php 在 PATH 中,但exec "/usr/local/bin/php artisan serve --host=0.0.0.0"
行(w/或w/o /usr/local/bin 路径)说:
/var/www/docker_init.sh: exec: line 16: /usr/local/bin/php artisan serve --host=0.0.0.0: not found
docker 文件包含:
FROM php:8.2-fpm-alpine
# Arguments defined in docker-compose.yml
ARG user=fcms
ARG uid=1000
# install helper for installing php extensions
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
# install php extensions
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions @composer pdo_mysql exif pcntl gd imagick
# Set working directory
WORKDIR /var/www
# Create system user to run Composer and Artisan Commands
RUN addgroup -S $user && \
adduser -G $user -G www-data -G root -u $uid -h /home/$user -S $user && \
mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Copy the fcms code
COPY --chown=$user:www-data . .
RUN \
# move the right init file (which execs php artisan serve at the end)
mv docker/apache/init.artisan.sh ./docker_init.sh && \
# clean unused folders and blocking files
rm -rf docker vendor composer.lock .git && \
# Install everything
composer install --no-dev
# Set user
USER $user
HEALTHCHECK --interval=5m --timeout=3s --start-period=10s \
CMD curl -f http://localhost/ || exit 1
CMD ["/var/www/docker_init.sh"]
其中 docker_init.sh 是上面的脚本。 最后一件事,跑步:
docker run -it fcms.artisan php artisan serve --host=0.0.0.0
工作完美。
我不明白这里的“exec”有什么问题......
正如 @DavidMaze 评论所提供的,问题是我在 exec 命令周围添加了双引号。 除去它们,它就开始像魅力一样发挥作用