基于本地GitLab Runner的Laravel Docker Compose CI/CD部署方案咨询
Laravel项目GitLab CI/CD自动化部署流程优化咨询
我正在开发一个通过docker-compose部署php-fpm和nginx容器的Laravel项目,目标是借助GitLab CI/CD实现构建与部署自动化。已在Debian 12本地机器上安装了shell类型的GitLab Runner,尝试通过Runner执行构建、测试、部署阶段,将项目部署至另一台容器宿主机。目前已推进到docker compose up环节,不确定当前流程是否正确。
当前gitlab-ci.yml配置如下:
stages: - build_dependencies - test - deploy_production cache: paths: - vendor/ build_composer: stage: build_dependencies script: - composer install -n artifacts: paths: - ./vendor pest_test: stage: test script: - ./vendor/bin/pest larastan_test: stage: test script: - ./vendor/bin/phpstan analyse --memory-limit=2G --no-progress build_docker_image: stage: deploy_production dependencies: [] before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build -t $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -f ./.docker/Dockerfile . - docker push $CI_REGISTRY_IMAGE --all-tags rules: - if: $CI_COMMIT_BRANCH == "main" when: on_success deploy_containers: stage: deploy_production script: - scp /path/to/file username@a:/path/to/destination - ssh username@IP "docker compose up -d" rules: - if: $CI_COMMIT_BRANCH == "main" when: manual
PHP-FPM容器的自定义Dockerfile配置:
FROM composer:2.7.2 AS composer WORKDIR /var/www/ COPY . ./ RUN composer install --ignore-platform-reqs --prefer-dist --no-scripts --no-progress --no-interaction --no-dev \ --no-autoloader FROM php:8.2.8-fpm ENV USER=www ENV GROUP=www ENV ACCEPT_EULA=Y # Install dependencies RUN apt-get update && apt-get install -y \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ zip \ unzip \ gnupg \ gnupg2 \ nano # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install PHP extensions RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip RUN docker-php-ext-enable zip #DRIVER SQL SRV RUN apt-get update RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list RUN apt-get update RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18 RUN ACCEPT_EULA=Y apt-get install -y mssql-tools18 RUN echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc RUN apt-get install -y unixodbc-dev RUN apt-get -y install unixodbc-dev RUN pecl install sqlsrv pdo_sqlsrv RUN docker-php-ext-enable sqlsrv pdo_sqlsrv #DRIVER SQL SRV # Get the build app COPY --from=composer /var/www/ /var/www/ # Setup working directory WORKDIR /var/www/ # Create User and Group RUN groupadd -g 1000 ${GROUP} && useradd -u 1000 -ms /bin/bash -g ${GROUP} ${USER} # Grant Permissions RUN chown -R ${USER} /var/www EXPOSE 9000 CMD ["php-fpm"]
目前gitlab-ci.yml尚未完善,还需处理.env文件、版本发布等内容,想请教当前流程是否正确,有无更优实践方案?
当前流程合理性判断
你的基础流程框架是可行的:依赖构建→测试→镜像构建→手动部署的链路符合Laravel项目CI/CD的常规逻辑,尤其是将测试阶段前置、生产部署设为手动触发的设计,能有效避免错误代码直接上线。
优化实践方案
1. SSH部署的安全与效率优化
- 避免硬编码与明文传输:将部署目标信息(主机IP、用户名)存入GitLab项目的CI/CD变量;配置Runner与部署宿主机的免密SSH登录(在Runner生成密钥对,将公钥添加到部署宿主机
~/.ssh/authorized_keys),替代密码登录。 - 更新镜像再启动容器:部署时先拉取最新镜像,避免宿主机使用旧版本:
ssh username@$DEPLOY_HOST "cd /path/to/compose && docker compose pull && docker compose up -d" - 清理无效资源:部署后添加命令清理未使用的镜像、容器,节省宿主机资源:
ssh username@$DEPLOY_HOST "docker system prune -f"
2. .env文件处理
- 配置与代码分离:不要将
.env打包进镜像,通过GitLab CI/CD变量存储生产配置,部署时写入宿主机的.env.production文件,在docker-compose.yml中引用:services: php-fpm: image: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA env_file: - .env.production
3. 版本发布与镜像管理
- 规范化镜像标签:添加
$CI_COMMIT_TAG标签用于正式版本发布,配合Git标签实现版本回溯:script: - docker build -t $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG -f ./.docker/Dockerfile . - docker push $CI_REGISTRY_IMAGE --all-tags rules: - if: $CI_COMMIT_BRANCH == "main" - if: $CI_COMMIT_TAG - 设置镜像过期规则:在GitLab容器注册表中配置自动清理策略(如保留最近30个镜像、删除30天未使用的镜像),避免存储空间溢出。
4. Dockerfile优化
- 合并冗余命令:将重复的
apt-get install命令合并,减少镜像层数:#DRIVER SQL SRV RUN apt-get update && \ curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \ curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list && \ apt-get update && \ ACCEPT_EULA=Y apt-get install -y msodbcsql18 mssql-tools18 unixodbc-dev && \ echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc && \ pecl install sqlsrv pdo_sqlsrv && \ docker-php-ext-enable sqlsrv pdo_sqlsrv && \ apt-get clean && rm -rf /var/lib/apt/lists/* - 补全composer自动加载:在composer阶段添加自动加载生成命令:
RUN composer install --ignore-platform-reqs --prefer-dist --no-scripts --no-progress --no-interaction --no-dev \ --no-autoloader && \ composer dump-autoload --optimize - 移除不必要依赖:生产环境镜像可删除
git、nano等工具,缩小镜像体积。
5. CI阶段优化
- 并行测试:将单元测试与静态分析并行执行,缩短CI运行时间:
pest_test: stage: test script: - ./vendor/bin/pest parallel: true larastan_test: stage: test script: - ./vendor/bin/phpstan analyse --memory-limit=2G --no-progress parallel: true - 优化依赖缓存:添加
composer.lock作为缓存键,避免缓存失效时重新安装所有依赖:cache: paths: - vendor/ key: files: - composer.lock - 启用镜像构建缓存:利用GitLab Runner的Docker层缓存,减少镜像构建时间:
build_docker_image: stage: deploy_production before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -f ./.docker/Dockerfile . - docker push $CI_REGISTRY_IMAGE --all-tags
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

