如何将Laravel项目的CircleCI配置转换为可正常运行的Dockerfile
Laravel项目Docker配置转换方案
原有配置说明
你现有的CircleCI配置核心是搭建PHP7.3 + Node运行环境,安装Laravel所需的全部扩展,然后执行依赖安装、前端构建、单元测试流程,以下是修正后的可运行Docker配置:
修正后的Dockerfile
# 改用官方PHP7.3 Apache镜像,更适合生产/开发运行,避免CI镜像的冗余依赖 FROM php:7.3-apache # 安装系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libpng-dev \ zlib1g-dev \ libzip-dev \ libsqlite3-dev \ libmagickwand-dev \ zip \ unzip \ curl \ git \ nodejs \ npm \ # 清理apt缓存,大幅减小镜像体积 && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 安装核心PHP扩展 RUN docker-php-ext-install \ gd \ zip \ bcmath \ pcntl \ exif \ pdo_mysql \ mysqli # 安装PECL扩展 RUN pecl install imagick redis \ && docker-php-ext-enable imagick redis # 开启Apache rewrite模块,支持Laravel路由规则 RUN a2enmod rewrite # 导入自定义Apache虚拟主机配置 COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf # 全局安装Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 设置工作目录 WORKDIR /var/www/html # 先复制依赖描述文件,利用Docker层缓存,避免每次修改代码都重装依赖 COPY composer.json composer.lock ./ RUN composer install --prefer-dist --no-scripts --no-autoloader -n COPY package.json package-lock.json ./ RUN npm install # 复制全部项目代码 COPY . . # 执行后续构建步骤,对齐CI流程 RUN composer dump-autoload --optimize RUN npm run production RUN cp .env.example .env RUN php artisan key:generate # 正确设置目录权限,避免不安全的777配置 RUN chown -R www-data:www-data /var/www/html \ && chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache # 配置入口脚本 COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh ENTRYPOINT ["docker-entrypoint.sh"] # 暴露Web服务端口 EXPOSE 80
配套docker-compose.yml配置
version: "3.8" services: # Laravel主应用服务 app: build: . ports: - "8000:80" volumes: # 开发环境挂载本地代码,修改后实时生效 - ./:/var/www/html # 排除依赖目录,避免覆盖容器内安装的依赖 - /var/www/html/vendor - /var/www/html/node_modules environment: - APP_ENV=local - DB_CONNECTION=mysql - DB_HOST=db - DB_PORT=3306 - DB_DATABASE=laravel - DB_USERNAME=laravel - DB_PASSWORD=secret - REDIS_HOST=redis depends_on: - db - redis # MySQL数据库服务 db: image: mysql:5.7 ports: - "3306:3306" environment: - MYSQL_DATABASE=laravel - MYSQL_USER=laravel - MYSQL_PASSWORD=secret - MYSQL_ROOT_PASSWORD=root volumes: - mysql_data:/var/lib/mysql # Redis缓存服务 redis: image: redis:alpine ports: - "6379:6379" volumes: - redis_data:/data volumes: mysql_data: redis_data:
参考docker-entrypoint.sh
#!/bin/bash # 启动前可选执行数据库迁移 # php artisan migrate --force # 启动Apache服务 apache2-foreground
内容的提问来源于stack exchange,提问作者Juan Diaz
相关产品推荐
相关产品推荐

