Laravel Sail部署Linux服务器遇日志文件权限拒绝问题求助
Laravel Sail 部署到 Linux 服务器时出现 storage/logs/laravel.log 权限拒绝错误
我之前在WSL2的Ubuntu 22.04环境中配置的Laravel项目运行正常,现在要部署到Linux服务器上。目前phpMyAdmin和MySQL工作正常,但执行docker-compose up时,出现错误:
"/var/www/html/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied
我的服务器用户crashmaster对应的UID和GID是1002,已配置到.env的WWWUSER和WWWGROUP中。
相关配置文件
docker-compose.yml
# For more information: https://laravel.com/docs/sail version: '3' services: laravel.test: build: context: ./docker/8.1 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' image: rsu-8.1/app ports: - '${APP_PORT:-8080}:80' environment: WWWUSER: '${WWWUSER}' LARAVEL_SAIL: 1 volumes: - '.:/var/www/html' networks: - sail depends_on: - mysql #- redis #- selenium mysql: image: 'mysql:8.0' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' volumes: - 'sailmysql:/var/lib/mysql' networks: - sail healthcheck: test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] phpmyadmin: image: phpmyadmin restart: always depends_on: - mysql networks: - sail ports: - 8081:80 environment: - PMA_ARBITRARY=1 #redis: # image: 'redis:alpine' # ports: # - '${FORWARD_REDIS_PORT:-6379}:6379' # volumes: # - 'sailredis:/data' # networks: # - sail # healthcheck: # test: ["CMD", "redis-cli", "ping"] #meilisearch: # image: 'getmeili/meilisearch:latest' # ports: # - '${FORWARD_MEILISEARCH_PORT:-7700}:7700' # volumes: # - 'sailmeilisearch:/data.ms' # networks: # - sail # #mailhog: # image: 'mailhog/mailhog:latest' # ports: # - '${FORWARD_MAILHOG_PORT:-1025}:1025' # - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025' # networks: # - sail #selenium: # image: 'selenium/standalone-chrome' # volumes: # - '/dev/shm:/dev/shm' # networks: # - sail networks: sail: driver: bridge volumes: sailmysql: driver: local #sailredis: # driver: local #sailmeilisearch: # driver: local
.env
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:+6ss7B4aED3QCVCSUTAFAG/+NslL8GQYG8BwuTjUyEY= APP_DEBUG=true APP_URL=http://rsu-new-app.test LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=Messages DB_USERNAME=fabio DB_PASSWORD=password BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 MEMCACHED_HOST=memcached SAIL_XDEBUG_MODE=develop,debug SAIL_XDEBUG_CONFIG="client_host=localhost" REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" SCOUT_DRIVER=meilisearch MEILISEARCH_HOST=http://meilisearch:7700 JWT_SECRET=qQqAfUyZcaPanHXkj0YpHC9OfooeOiuVDSXygghugzwAYen0DJyUHaG1RdxXEzMj WWWGROUP=1002 WWWUSER=1002
Dockerfile
FROM ubuntu:22.04 LABEL maintainer="Taylor Otwell" ARG WWWGROUP ARG NODE_VERSION=16 ARG POSTGRES_VERSION=14 WORKDIR /var/www/html ENV DEBIAN_FRONTEND noninteractive ENV TZ=UTC RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt-get update \ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 \ && mkdir -p ~/.gnupg \ && chmod 600 ~/.gnupg \ && echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \ && echo "keyserver hkp://keyserver.ubuntu.com:80" >> ~/.gnupg/dirmngr.conf \ && gpg --recv-key 0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c \ && gpg --export 0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c > /usr/share/keyrings/ppa_ondrej_php.gpg \ && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ && apt-get update \ && apt-get install -y php8.1-cli php8.1-dev \ php8.1-pgsql php8.1-sqlite3 php8.1-gd \ php8.1-curl \ php8.1-imap php8.1-mysql php8.1-mbstring \ php8.1-xml php8.1-zip php8.1-bcmath php8.1-soap \ php8.1-intl php8.1-readline \ php8.1-ldap \ php8.1-msgpack php8.1-igbinary php8.1-redis php8.1-swoole \ php8.1-memcached php8.1-pcov php8.1-xdebug \ && php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \ && curl -sLS https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \ && apt-get install -y nodejs \ && npm install -g npm \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarn.gpg >/dev/null \ && echo "deb [signed-by=/usr/share/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/pgdg.gpg >/dev/null \ && echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ && apt-get update \ && apt-get install -y yarn \ && apt-get install -y mysql-client \ && apt-get install -y postgresql-client-$POSTGRES_VERSION \ && apt-get -y autoremove \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.1 RUN groupadd --force -g $WWWGROUP sail RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail COPY start-container /usr/local/bin/start-container COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY php.ini /etc/php/8.1/cli/conf.d/99-sail.ini RUN chmod +x /usr/local/bin/start-container EXPOSE 8000 ENTRYPOINT ["start-container"]
已尝试的解决方案
- 修改Dockerfile,将默认创建的
sail用户替换为服务器上的crashmaster用户 - 修改
docker-compose.yml的卷配置,添加/etc/passwd:/etc/passwd:ro和/etc/group:/etc/group:ro挂载
解决方案
1. 匹配容器与服务器用户UID
Dockerfile中默认创建的sail用户UID是1337,与你的服务器用户UID1002不匹配,这是权限问题核心。修改Dockerfile内的用户创建命令:
# 替换原有的用户创建代码 RUN groupadd --force -g $WWWGROUP crashmaster RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u $WWWUSER crashmaster
同时检查start-container脚本,确保内部使用crashmaster用户而非sail用户。
2. 正确挂载系统用户文件
在docker-compose.yml的laravel.test服务volumes中添加:
volumes: - '.:/var/www/html' - '/etc/passwd:/etc/passwd:ro' - '/etc/group:/etc/group:ro'
让容器能识别服务器的用户和组信息。
3. 修复项目目录权限
在服务器上执行以下命令,确保Laravel所需目录权限正确:
# 递归设置目录所属用户组 sudo chown -R crashmaster:crashmaster /path/to/your/laravel/project # 设置storage和bootstrap/cache目录权限 sudo chmod -R 775 storage bootstrap/cache
若需要更严格的权限:
sudo chmod -R 755 storage bootstrap/cache sudo find storage bootstrap/cache -type f -exec chmod 644 {} \; sudo find storage bootstrap/cache -type d -exec chmod 755 {} \;
4. 重新构建并启动容器
执行命令重新构建镜像并启动服务:
docker-compose build --no-cache docker-compose up -d
5. 临时调试(可选)
若问题仍存在,可进入容器排查:
docker-compose exec laravel.test bash # 查看日志文件权限 ls -l /var/www/html/storage/logs/laravel.log # 查看当前运行用户 whoami
确认当前用户是否为crashmaster,以及文件是否具备写入权限。
内容的提问来源于stack exchange,提问作者Fábio Baptista
相关产品推荐
相关产品推荐

