如何在 Docker 容器中安装 PHP Composer

问题描述 投票:0回答:10

我尝试找到一种使用 docker 和 laravel 创建开发环境的方法。

我有以下 dockerfile:

FROM php:7.1.3-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev \
    mysql-client libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
&& docker-php-ext-install mcrypt pdo_mysql
&& chmod -R o+rw laravel-master/bootstrap laravel-master/storage

Laravel 要求 Composer 在进行数据库迁移时调用 Composer dump-autoload。因此,我需要在 docker 容器内安装 Composer。

我尝试过:

RUN curl -sS https://getcomposer.org/installer | php -- \
--install-dir=/usr/bin --filename=composer

但是当我打电话时

docker-compose up
docker-compose exec app composer dump-autoload

它抛出以下错误:

rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"exec: \\\"composer\\\": executable file not found in $PATH\"\n"

我将非常乐意获得建议,如何将作曲家添加到我的 dockerfile 中的 PATH 中,或者我还能做些什么来克服这个错误。

感谢您的支持。 另外:如果您需要查看 docker-compose.yml 文件或其他任何内容,this 是 gitub 存储库。

php laravel docker composer-php docker-compose
10个回答
320
投票

您可以使用 composer 图像执行内联多阶段构建,这样您基本上只需将

composer
二进制文件复制到 PHP docker 图像中。

在 Dockerfile 中:

COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer

158
投票

我可以安装 Composer,在我的测试 dockerfile 上添加此行:

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

这是 dockerfile:

FROM php:7.1.3-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev \
    mysql-client libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
&& docker-php-ext-install mcrypt pdo_mysql

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

它对我有用,为了测试是否安装了作曲家,我访问我的容器 bash 并执行:

composer --version
Composer version 1.6.5 2018-05-04 11:44:59

7
投票

这就是我在 2021 年使用 Laravel 8.4 将其部署到 Google Cloud 中的 CloudRun 的方法:

Dockerfile

#Get Composer
FROM composer:2.0 as vendor

WORKDIR /app

COPY database/ database/
COPY composer.json composer.json
COPY composer.lock composer.lock

RUN composer install \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --no-dev \
    --prefer-dist

COPY . .
RUN composer dump-autoload

// 一些更多的自定义步骤,例如

FROM node:14.9 as frontend
...
FROM php:7.4-fpm
...

// 复制 Composer 依赖项

# Copy Composer dependencies
COPY --from=vendor app/vendor/ ./vendor/
COPY . .

//更多自定义步骤

...

我的 Dockerfile 结束,以启动已清除优化缓存的应用程序

# Run Laravel commands
RUN php artisan optimize:clear

CMD php artisan serve --host=0.0.0.0 --port=8080

EXPOSE 8080

4
投票

使用

创建您的作曲家文件的可执行文件
RUN curl -sS https://getcomposer.org/installer | php -- \
--install-dir=/usr/bin --filename=composer && chmod +x /usr/bin/composer 

3
投票

在 dockerfile 中使用

composer
使用
curl

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

Dockerfile

FROM 8.1.4-fpm

RUN apt-get update && apt-get install -y \
    git \
    curl \
    zip \
    unzip

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www

1
投票

我们运行的命令基本相同,但有所不同,

--install-dir=/usr/local/bin

或者,您应该将 Composer bin 文件路径添加到 $PATH 变量。

export PATH=$PATH":/usr/bin"

0
投票

我只是想建议另一种方法。

Dockerfile:

RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer

0
投票
FROM php:7.3-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli

RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
RUN apk update
RUN apk upgrade
RUN apk add bash
RUN alias composer='php /usr/bin/composer'

0
投票

使用实际的文档

Dockerfile:

# Install composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer

-6
投票

我的问题解决了。我刚刚停止了系统上的

firewalld
服务

© www.soinside.com 2019 - 2024. All rights reserved.