如何编写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
使用说明
- 本地创建
app目录,将Laravel项目代码放入其中(或后续在容器内执行laravel new .创建) - 构建镜像:
docker-compose build - 启动服务:
docker-compose up -d - 进入容器执行命令:
docker-compose exec laravel bash,比如运行迁移、安装依赖等
内容的提问来源于stack exchange,提问作者MaxKuz
相关产品推荐
相关产品推荐

