Laravel Sail执行artisan命令报错:找不到sail用户
问题:执行
sail artisan报错unable to find user sail: no matching entries in passwd file 从GitHub克隆了一个自带Laravel Sail的Laravel项目,为安装Composer依赖,执行了以下命令:
docker run --rm \ -u "$(id -u):$(id -g)" \ -v "$(pwd):/var/www/html" \ -w /var/www/html \ laravelsail/php81-composer:latest \ composer install --ignore-platform-reqs
之后运行sail up,所有镜像已拉取并构建完成。目前可通过浏览器访问项目及路由,也能使用sail mysql命令,但执行sail artisan命令时,出现报错:unable to find user sail: no matching entries in passwd file。
环境:Windows系统,使用WSL2,默认Linux发行版是Ubuntu 20。新建的Laravel Sail项目无此问题。
相关配置文件
docker-compose.yml
version: "3.7" services: #Laravel App app: build: context: ./docker/php/${DOCKER_PHP_VERSION} dockerfile: Dockerfile args: xdebug_enabled: ${DOCKER_PHP_XDEBUG_ENABLED} image: ${COMPOSE_PROJECT_NAME}-app restart: unless-stopped tty: true working_dir: /var/www/html environment: XDEBUG_MODE: '${DOCKER_PHP_XDEBUG_MODE:-off}' volumes: - ./:/var/www/html networks: - app_network depends_on: - mysql - redis - meilisearch - minio nginx: image: nginx:alpine restart: unless-stopped tty: true ports: - '${DOCKER_NGINX_PORT:-80}:80' volumes: - ./:/var/www/html - ./docker/nginx/dev/:/etc/nginx/conf.d/ networks: - app_network depends_on: - app # S3 Development minio: image: 'minio/minio:latest' ports: - '${DOCKER_MINIO_PORT:-9000}:9000' - '${DOCKER_MINIO_CONSOLE_PORT:-8900}:8900' environment: MINIO_ROOT_USER: 'laravel' MINIO_ROOT_PASSWORD: 'password' volumes: - 'appminio:/data/minio' networks: - app_network command: minio server /data/minio --console-address ":8900" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] retries: 3 timeout: 5s # Laravel Scout Search Provider meilisearch: image: 'getmeili/meilisearch:latest' platform: linux/x86_64 environment: - PUID=${DOCKER_PUID:-1000} - PGID=${DOCKER_PGID:-1000} - TZ=${DOCKER_TZ:-Australia/Brisbane} restart: unless-stopped ports: - '${DOCKER_MEILISEARCH_PORT:-7700}:7700' volumes: - 'appmeilisearch:/data.ms' networks: - app_network # Database mysql: image: 'mysql/mysql-server:8.0' command: --default-authentication-plugin=mysql_native_password ports: - '${DOCKER_MYSQL_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD:-abc123}' MYSQL_ROOT_HOST: "%" MYSQL_DATABASE: '${DB_DATABASE:-laravel}' MYSQL_USER: '${DB_USERNAME:-laravel}' MYSQL_PASSWORD: '${DB_PASSWORD:-abc123}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 restart: unless-stopped volumes: - 'appmysql:/var/lib/mysql' networks: - app_network healthcheck: test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] retries: 3 timeout: 5s # Debug emails sent from the app mailcatcher: restart: unless-stopped image: dockage/mailcatcher environment: - PUID=${DOCKER_PUID:-1000} - PGID=${DOCKER_PGID:-1000} - TZ=${DOCKER_TZ:-Australia/Brisbane} ports: - "${DOCKER_MAILCATCHER_WEB_PORT:-1080}:1080" - "${DOCKER_MAILCATCHER_SMTP_PORT:-1025}:1025" networks: - app_network # Redis Database redis: healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 1m timeout: 10s retries: 3 start_period: 30s image: redis restart: unless-stopped volumes: - 'appredis:/data' environment: - PUID=${DOCKER_PUID:-1000} - PGID=${DOCKER_PGID:-1000} - TZ=${DOCKER_TZ:-Australia/Brisbane} ports: - ${DOCKER_REDIS_PORT:-6379}:6379 networks: - app_network volumes: appredis: driver: local appmysql: driver: local appmeilisearch: driver: local appminio: driver: local networks: app_network: driver: bridge
.env
APP_NAME="Boilerplate" APP_ENV=local APP_KEY=base64:vnhPCkeEz8MOUqKv7dYsZvTluoB3bra/aH+MONTUM9I= APP_DEBUG=true APP_URL=http://127.0.0.1:8000 FRONTEND_URL=http://127.0.0.1:8000 EMAIL_VERIFICATION_REQUIRED=true TOKEN_ON_REGISTER=false LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=safe_proud DB_USERNAME=sail DB_PASSWORD=password BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=database SESSION_DRIVER=file SESSION_LIFETIME=120 SESSION_CONNECTION=localhost REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailcatcher MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=developers@presentcompany.co MAIL_FROM_NAME="${APP_NAME}" SCOUT_DRIVER=meilisearch MEILISEARCH_HOST=http://127.0.0.1:7700 MEILISEARCH_KEY=masterKey #FILESYSTEM_DRIVER=s3 AWS_ACCESS_KEY_ID=laravel AWS_SECRET_ACCESS_KEY=password AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET=store AWS_ENDPOINT=http://s3:9000 AWS_USE_PATH_STYLE_ENDPOINT=true 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}" DOCKER_PUID=1000 DOCKER_PGID=1000 DOCKER_TZ=Australia/Brisbane DOCKER_NGINX_PORT=8000 DOCKER_REDIS_PORT=6379 DOCKER_MAILCATCHER_WEB_PORT=1080 DOCKER_MAILCATCHER_SMTP_PORT=1025 DOCKER_MEILISEARCH_PORT=7700 DOCKER_MYSQL_PORT=3306 DOCKER_MINIO_PORT=9000 DOCKER_MINIO_CONSOLE_PORT=8900 COMPOSE_PROJECT_NAME=boilerplate DOCKER_PHP_VERSION=8.1 DOCKER_PHP_XDEBUG_ENABLED=false DOCKER_PHP_XDEBUG_MODE=develop,debug
更新: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"]
解决方案
报错核心原因:sail artisan默认以sail用户身份执行命令,但项目镜像构建时未正确传入WWWGROUP参数,导致容器内未创建sail用户,或用户信息不匹配。
按以下步骤修复:
修改
docker-compose.yml的app服务配置
在build.args中添加WWWGROUP参数,传递.env中的DOCKER_PGID值:app: build: context: ./docker/php/${DOCKER_PHP_VERSION} dockerfile: Dockerfile args: xdebug_enabled: ${DOCKER_PHP_XDEBUG_ENABLED} WWWGROUP: ${DOCKER_PGID:-1000} # 新增此行 # 其余配置保持不变重新构建镜像
执行命令重新构建app服务镜像,确保参数生效:sail build --no-cache app重启容器
停止并重新启动所有服务:sail down && sail up -d验证修复
执行sail artisan命令测试,例如:sail artisan --version此时应不再出现用户找不到的报错。
临时绕过方案(不推荐长期使用):以root身份执行命令
sail root artisan [具体命令]
内容的提问来源于stack exchange,提问作者Rayan
相关产品推荐
相关产品推荐

