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

如何编写Dockerfile构建Laravel镜像?求可用示例

修正后的Laravel Dockerfile与Compose配置

原Dockerfile的核心问题

  • 工作目录与挂载目标路径不匹配(原用/var/www,你需要挂载/app)
  • 构建阶段拷贝本地代码到镜像,与卷挂载需求冲突(挂载后本地代码会覆盖镜像内代码)
  • 提前声明VOLUME干扰卷挂载逻辑
  • 构建时执行composer install,但挂载后本地无vendor目录会导致依赖缺失

可用Dockerfile示例

FROM php:8.1-fpm

# 切换到目标工作目录(与挂载路径一致)
WORKDIR /app

# 添加PHP扩展安装脚本
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# 安装Laravel必需的PHP扩展
RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
    install-php-extensions mbstring pdo_mysql zip exif pcntl gd memcached

# 安装系统依赖与Nginx、Supervisor
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    unzip \
    git \
    curl \
    nginx \
    supervisor && \
    # 清理APT缓存
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 安装Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# 创建应用用户(与宿主机UID/GID匹配,避免权限问题)
RUN groupadd -g 1000 app && \
    useradd -u 1000 -ms /bin/bash -g app app

# 设置目录权限(提前为挂载后的storage等目录预留权限)
RUN mkdir -p /app/storage /app/bootstrap/cache && \
    chown -R app:app /app && \
    chmod -R 775 /app/storage /app/bootstrap/cache

# 复制配置文件(假设你的配置文件在本地docker目录下)
COPY docker/nginx.conf /etc/nginx/sites-enabled/default
COPY docker/php.ini /usr/local/etc/php/conf.d/app.ini
COPY docker/supervisor.conf /etc/supervisor/conf.d/app.conf
COPY docker/run.sh /usr/local/bin/run.sh

# 给启动脚本加执行权限
RUN chmod +x /usr/local/bin/run.sh

# 暴露端口
EXPOSE 80

# 切换到非root用户运行
USER app

# 启动命令
ENTRYPOINT ["run.sh"]

配套docker-compose.yml示例

version: '3.8'

services:
  laravel:
    build: .
    ports:
      - "8000:80"
    volumes:
      - ./app:/app  # 挂载本地app目录到容器内/app
    environment:
      - APP_ENV=local
      - DB_CONNECTION=mysql
      # 其他环境变量根据你的Laravel配置添加
    depends_on:
      - mysql  # 如果需要数据库服务,可添加

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=laravel
      - MYSQL_USER=laravel
      - MYSQL_PASSWORD=laravel
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

启动脚本run.sh示例(放在本地docker目录)

#!/bin/bash

# 如果是首次启动,安装依赖
if [ ! -d "/app/vendor" ]; then
    composer install
fi

# 生成应用密钥(如果.env不存在)
if [ ! -f "/app/.env" ]; then
    cp /app/.env.example /app/.env
    php artisan key:generate
fi

# 设置目录权限(确保挂载后权限正确)
chmod -R 775 /app/storage /app/bootstrap/cache

# 启动Supervisor(管理Nginx和PHP-FPM)
exec supervisord -n -c /etc/supervisor/conf.d/app.conf

使用说明

  1. 本地创建app目录,将Laravel项目代码放入其中(或后续在容器内执行laravel new .创建)
  2. 构建镜像:docker-compose build
  3. 启动服务:docker-compose up -d
  4. 进入容器执行命令:docker-compose exec laravel bash,比如运行迁移、安装依赖等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:25:28