Docker部署旧Laravel项目:Composer报错使用未指定PHP版本
问题
为运行旧版Laravel项目搭建了Docker环境,相关配置如下:
Dockerfile内容
FROM php:7.2-fpm-alpine WORKDIR /var/www/html RUN docker-php-ext-install pdo pdo_mysql
docker-compose.yml内容
version: '3' networks: laravel: services: nginx: image: nginx:stable-alpine container_name: nginx ports: - "8080:80" volumes: - ./src:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php - mysql networks: - laravel mysql: image: mysql:5.7.22 container_name: mysql restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: homestead MYSQL_USER: homestead MYSQL_PASSWORD: secret MYSQL_ROOT_PASSWORD: secret SERVICE_TAGS: dev SERVICE_NAME: mysql networks: - laravel php: build: context: . dockerfile: Dockerfile container_name: php volumes: - ./src:/var/www/html ports: - "9000:9000" networks: - laravel composer: image: composer:latest container_name: composer volumes: - ./src:/var/www/html working_dir: /var/www/html depends_on: - php networks: - laravel npm: image: node:13.7 container_name: npm volumes: - ./src:/var/www/html working_dir: /var/www/html entrypoint: ['npm'] artisan: build: context: . dockerfile: Dockerfile container_name: artisan volumes: - ./src:/var/www/html depends_on: - mysql working_dir: /var/www/html entrypoint: ['/var/www/html/artisan'] networks: - laravel
执行命令 docker-compose run --rm composer update 时出现报错:
Problem 1 - phpunit/phpunit[6.0.0, ..., 6.5.14] require php ^7.0 -> your php version (8.2.10) does not satisfy that requirement. - Root composer.json requires phpunit/phpunit ~6.0 -> satisfiable by phpunit/phpunit[6.0.0, ..., 6.5.14]
但执行 docker-compose run php --version 显示PHP版本为7.2.34:
PHP 7.2.34 (fpm-fcgi) (built: Dec 17 2020 10:32:58) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
疑问:为何Composer会报错使用PHP8.2.10版本,如何解决?
原因分析
composer服务使用的是composer:latest镜像,该镜像默认内置PHP8.x版本(当前为8.2.10),和项目依赖的PHP7.2版本不匹配。你测试的php服务基于自己构建的PHP7.2镜像,版本显示正常,但Composer运行在独立容器中,使用的是自身镜像的PHP版本,因此出现版本兼容报错。
解决方法
方法一:使用匹配项目PHP版本的Composer镜像
修改docker-compose.yml中的composer服务,指定适配PHP7.2的Composer镜像:
composer: image: composer:2.5.8-php7.2 # 选择与PHP7.2兼容的Composer版本标签 container_name: composer volumes: - ./src:/var/www/html working_dir: /var/www/html depends_on: - php networks: - laravel
方法二:在自定义PHP镜像中安装Composer
修改Dockerfile,在PHP7.2镜像内直接安装Composer,确保Composer使用当前容器的PHP版本:
FROM php:7.2-fpm-alpine WORKDIR /var/www/html # 安装Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN docker-php-ext-install pdo pdo_mysql
然后修改docker-compose.yml的composer服务,使用自定义构建的PHP镜像:
composer: build: context: . dockerfile: Dockerfile container_name: composer volumes: - ./src:/var/www/html working_dir: /var/www/html entrypoint: ['composer'] depends_on: - php networks: - laravel
执行命令重新构建镜像并运行Composer:
docker-compose build composer docker-compose run --rm composer update
内容的提问来源于stack exchange,提问作者nikulas13
相关产品推荐
相关产品推荐

