You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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用户,或用户信息不匹配。

按以下步骤修复:

  1. 修改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} # 新增此行
      # 其余配置保持不变
    
  2. 重新构建镜像
    执行命令重新构建app服务镜像,确保参数生效:

    sail build --no-cache app
    
  3. 重启容器
    停止并重新启动所有服务:

    sail down && sail up -d
    
  4. 验证修复
    执行sail artisan命令测试,例如:

    sail artisan --version
    

    此时应不再出现用户找不到的报错。

临时绕过方案(不推荐长期使用):以root身份执行命令

sail root artisan [具体命令]

内容的提问来源于stack exchange,提问作者Rayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:41:57