Php 如何在容器中安装composer依赖项?

Php 如何在容器中安装composer依赖项?,php,docker,docker-compose,composer-php,Php,Docker,Docker Compose,Composer Php,我想做的事 我正在尝试将构建在CodeIgniter4上的php应用程序dockerize。此应用程序具有以下依赖项,这些依赖项通常通过composer安装: "require": { "php": "^7.3 || ^8.0", "myth/auth": "dev-develop", "codeigniter4/framework": "^4

我想做的事

我正在尝试将构建在CodeIgniter4上的php应用程序dockerize。此应用程序具有以下依赖项,这些依赖项通常通过composer安装:

"require": {
    "php": "^7.3 || ^8.0",
    "myth/auth": "dev-develop",
    "codeigniter4/framework": "^4.1",
    "codeigniter4/translations" : "^4.0"
},
项目结构组织如下:

docker
    database
    nginx
    php-fpm
    docker-compose.yml
src
    ... app files ...
tests
composer.json
docker compose.yml
中,我有一个名为
php fpm
的服务,它将所有应用程序文件复制到
/var/www/html
nginx
公共目录:

php-fpm:
  container_name: boilerplate_app
  build:
    context: ./php-fpm
  volumes:
    - ../src:/var/www/html
我需要做的是使用composer安装应用程序依赖项

我尝试的

最初,我想在
php fpm
文件夹中的
Dockerfile
中执行此操作:

FROM php:8.0.2-fpm-alpine

RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install mysqli    

# Install Composer
COPY --from=composer /usr/bin/composer /usr/bin/composer

RUN composer require --working-dir=../../ app/boilerplate

COPY ./config/php.ini /usr/local/etc/php/

CMD ["php-fpm"]

EXPOSE 9000
实际上,我已经在容器中安装了
composer
,然后我尝试安装项目根目录中可用的
composer.json
文件中的所有依赖项

问题

不幸的是,当我运行命令
docker compose up--build
时,会出现以下错误:

当前目录(./composer.json)中不存在composer.json,这可能是以下异常的原因

容器似乎无法访问
composer.json
文件,或者我对路径参数
working dir
做了一些不好的事情

因此,我想到另一个解决方案,在
docker compose.yml
中定义另一个容器,它将composer实例分隔开:

composer:
  image: composer:2.0.9
  command: ["composer", "require", "app/boilerplate"]
  volumes:
    - /var/www/html
这应该从根目录中读取
composer.json
文件,然后应该通过命令
composer require app/boilerplate
安装所有依赖项,但是再次出现相同的错误:

Composer在
/app
中找不到
Composer.json
文件

这是完整的
docker compose.yml

version: '3'

services:
  php-fpm:
    container_name: boilerplate_app
    build:
      context: ./php-fpm
    volumes:
      - ../src:/var/www/html

  nginx:
    container_name: boilerplate_nginx
    build:
      context: ./nginx
    volumes:
      - ../src:/var/www/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/sites/:/etc/nginx/sites-available
      - ./nginx/conf.d/:/etc/nginx/conf.d
    ports:
      - "8881:80"
      - "8882:443"
    depends_on:
      - php-fpm

  database:
    container_name: boilerplate_db
    build:
      context: ./database
    environment:
      - MYSQL_DATABASE=boilerplate_db
      - MYSQL_ROOT_PASSWORD=test
      - MYSQL_USER=foo
      - MYSQL_PASSWORD=test
    volumes:
      - ./database/data.sql:/docker-entrypoint-initdb.d/data.sql

  composer:
    image: composer:2.0.9
    command: ["composer", "require", "app/boilerplate"]
    volumes:
      - /var/www/html
这是
composer.json
文件:

{
    "name": "app/boilerplate",
    "description": "CodeIgniter4 Boilerplate based on AdminLTE 3 with user management, roles, permissions, ...",
    "require": {
        "php": "^7.3 || ^8.0",
        "myth/auth": "dev-develop",
        "codeigniter4/framework": "^4.1",
        "codeigniter4/translations" : "^4.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.1",
        "fakerphp/faker": "^1.13"
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "autoload": {
        "psr-4": {
            "app\\boilerplate\\": "src"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-update-cmd": [
          "@composer dump-autoload"
        ],
        "test": "phpunit --colors=always -vvv"
    }
}
我能做些什么来解决这个问题

文件夹结构图像预览:


看来你有几个问题

首先,您依赖于绑定挂载。但是这些在运行时可用,但在构建时不可用

因此,在运行
composer安装之前,您需要将
composer.*
文件复制到docker映像中

然后,您将很难执行此操作,因为您将构建上下文移动到了项目的子目录中,这将导致从父目录复制文件的问题

首先,更改构建上下文,只需引用构建项目所需的
Dockerfile

服务:
php fpm:
容器名称:样板应用程序
建造:
dockerfile:./php fpm/dockerfile
上下文:。
卷数:
-./src:/var/www/html
#剩下的docker-compose.yml
完成此操作后,您需要调整
Dockerfile
,以考虑到现在它的构建上下文是向上一个目录,并添加所需的
COPY
语句

我还更新了dockerfile以利用Docker多阶段流程

来自作曲家的
:2作为作曲家
运行rm-rf/var/www&&mkdir-p/var/www/html
WORKDIR/var/www/html
复制composer.json composer.lock/
#这是生产设置,我运行的是“无开发”,请相应调整
#如果你需要的话
运行composer安装--忽略平台要求--首选dist--无脚本--无进度--无交互--无开发--无自动加载程序
运行composer dump autoload--optimize--apcu--no dev
来自php:8.0.2-fpm-alpine
WORKDIR/var/www/html
运行docker php ext安装pdo_mysql
运行docker php ext安装mysqli
复制php fpm/config/php.ini/usr/local/etc/php/
COPY--from=composer\u stage/var/www/html/var/www/html
复制src-src/
CMD[“php fpm”]
暴露9000
我还添加了一个
COPY
语句来复制您的项目
src
dir,因为除此之外,您正在构建的映像具有编写器依赖项,而没有其他依赖项。这样,您的应用程序就是一个完全独立的容器(没有双关语)

您还应该确保
src
mountpoints。由于这些内容实际上并不适用于图像构建,而是仅在实际运行容器时使用,因此我没有仔细阅读它们


Dockerize/containerize应用程序首先要构建正确的映像,然后您需要创建适当的使用说明文件

您尝试了哪些方法使其工作?我假设在构建映像时运行了
composer require
,而在运行之前,应用程序数据不会出现在该映像中it@NicoHaase我试图在
php fpm
中运行
composer require
,原因是容器移动
nginx
目录中的应用程序文件。我想这个作曲家必须在那个容器中执行:1。复制应用程序文件2。安装dependenciesYeah,然后在将应用程序数据添加到container@Nico哈斯,我已经这么做了。问题在于composer.json文件位于app目录中,Dockerfile无法运行
composer require
Yes,因为我假设:在构建容器期间运行
composer require
不起作用,因为您稍后装载卷。上面是一个“工作示例”。您可以使用它来修复您的版本。我尝试过,但无法运行它,错误显示Dockerfile不是有效的映像。你能上传代码吗?我根据这一点和你的项目结构做了一个快速的“概念证明”。刚刚用docker compose build
尝试了它,它就生成了。您可以将其作为修复自己的项目的起点。