我的目标
我正在尝试使用Docker将这个基于CodeIgniter 4构建的php应用程序进行容器化。该应用程序具有以下依赖项,通常通过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"
}
}
我该怎么修复这个问题?
文件夹结构图像预览:
![enter image description here](https://istack.dev59.com/dEYtt.webp)
composer require
,而直到你运行它之前,你的应用程序数据才不会出现在该镜像中。 - Nico Haasephp-fpm
内部运行composer require
,因为它是将应用程序文件移动到nginx
目录的容器。我认为必须在该容器中执行 composer:1. 复制应用程序文件 2. 安装依赖项。 - sfarzosocomposer require
命令。 - sfarzosocomposer require
是不起作用的,因为您稍后会挂载卷。 - Nico Haase