如何在Docker容器中安装PHP Composer

And*_*dre 9 php laravel composer-php docker docker-compose

我尝试找出一种使用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
Run Code Online (Sandbox Code Playgroud)

Laravel要求作曲家在进行数据库迁移时调用作曲家dump-autoload。因此,我需要在docker容器内使用composer。

我试过了:

RUN curl -sS https://getcomposer.org/installer | php -- \
--install-dir=/usr/bin --filename=composer
Run Code Online (Sandbox Code Playgroud)

但是当我打电话

docker-compose up
docker-compose exec app composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

它引发以下错误:

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"
Run Code Online (Sandbox Code Playgroud)

我将很乐意为我提供如何在dockerfile中将composer添加到PATH的建议,或者我还能做些什么来克服此错误。

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

小智 163

在 Dockerfile 中:

COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“--from”是相当新的,并非在所有环境中都可用。 (4认同)
  • 请注意,如果您的“composer.json”中有只能从源代码安装的软件包,那么您还需要安装“git”。 (4认同)
  • 如果您需要特定版本,这很好用,Tank you。我正在使用这个 `COPY --from=composer:2.1.8 /usr/bin/composer /usr/local/bin/composer` (4认同)
  • 我的问题解决了。我刚刚停止了系统上的“firewalld”服务 (2认同)

Bra*_*era 17

我可以安装composer在我的测试dockerfile上添加以下行:

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

它对我有用,可以通过访问我的容器bash并执行以下命令来测试是否安装了作曲家:

composer --version
Composer version 1.6.5 2018-05-04 11:44:59
Run Code Online (Sandbox Code Playgroud)

  • 你需要运行 docker run -dit my-image 命令生成的镜像,然后你需要执行 docker exec -it container-id sh ,通过这个命令你可以访问容器终端,当你在容器终端上,您可以执行“composer --version”命令来验证它是否已安装在您的容器上 (3认同)
  • 最好像这样得到它:`COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer`,来自[这个答案](/sf/answers/4108609501/ 1155833) (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

// 更多自定义步骤,例如

FROM node:14.9 as frontend
...
FROM php:7.4-fpm
...
Run Code Online (Sandbox Code Playgroud)

// 复制 Composer 依赖项

# Copy Composer dependencies
COPY --from=vendor app/vendor/ ./vendor/
COPY . .
Run Code Online (Sandbox Code Playgroud)

// 更多自定义步骤

...
Run Code Online (Sandbox Code Playgroud)

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

# Run Laravel commands
RUN php artisan optimize:clear

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

EXPOSE 8080
Run Code Online (Sandbox Code Playgroud)

  • 请注意,不建议使用“artisanserve”进行生产。 (4认同)