gpt4 book ai didi

php - 如何在容器中安装 Composer 依赖项?

转载 作者:行者123 更新时间:2023-12-03 23:40:05 53 4
gpt4 key购买 nike

我正在尝试做的
我正在尝试 dockerize this php 应用程序基于 CodeIgniter 4 构建。该应用程序具有以下依赖项,通常通过 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公共(public)目录:
php-fpm:
container_name: boilerplate_app
build:
context: ./php-fpm
volumes:
- ../src:/var/www/html
我需要做的是使用 composer 安装应用程序依赖项。
我试过的
最初,我想在 Dockerfile 中执行此操作可用 php-fpm文件夹:
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引发此错误:

No composer.json present in the current directory (./composer.json), this may be the cause of the following exception.


似乎容器无法访问 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 could not find a composer.json file in /app.


这是完整的 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

最佳答案

看来你有几个问题。
首先,您依赖绑定(bind)挂载。但这些都可以在 运行时 ,但不在 构建时间 .
所以你需要复制composer.*运行前将文件添加到 docker 镜像中 composer install .
然后,您会遇到麻烦,因为您将构建上下文移动到项目的子目录中,这会使从父目录复制文件出现问题。
首先,更改构建上下文,然后简单地引用 Dockerfile您需要构建您的项目:

services:
php-fpm:
container_name: boilerplate_app
build:
dockerfile: ./php-fpm/Dockerfile
context: .
volumes:
- ./src:/var/www/html
# the rest of your docker-compose.yml
完成此操作后,您需要调整您的 Dockerfile考虑到现在它的构建上下文是一个目录,并添加所需的 COPY陈述。
我还更新了 dockerfile 以利用 Docker 多阶段进程
FROM composer:2 as composer_stage

RUN rm -rf /var/www && mkdir -p /var/www/html
WORKDIR /var/www/html

COPY composer.json composer.lock ./

# This are production settings, I'm running with 'no-dev', adjust accordingly
# if you need it
RUN composer install --ignore-platform-reqs --prefer-dist --no-scripts --no-progress --no-interaction --no-dev --no-autoloader

RUN composer dump-autoload --optimize --apcu --no-dev

FROM php:8.0.2-fpm-alpine

WORKDIR /var/www/html

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

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

COPY --from=composer_stage /var/www/html /var/www/html

COPY src src/

CMD ["php-fpm"]

EXPOSE 9000
我还添加了 COPY复制您的项目的声明 src dir,否则您正在构建的图像具有您的 Composer 依赖项,仅此而已。这样,您的应用程序就是一个适当的独立容器(没有双关语)。
您还应该确保 src挂载点。因为那些与图像无关 建筑 ,但仅在您实际为 时使用正在运行容器,我没有仔细检查它们。
Dockerize/containerize 应用程序首先是关于构建正确的镜像,然后您需要创建适当的使用文档

关于php - 如何在容器中安装 Composer 依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66283653/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com