在 Dockerfile 中运行 composer install

新手上路,请多包涵

我正在尝试 Dockerize 我的 laravel 应用程序。该应用程序已经在 git 中构建,但我 .gitignore 我的供应商文件夹。我添加了一个 Dockerfile,如下所示:

 FROM php:7.1-fpm-alpine

RUN apk update && apk add curl && \
  curl -sS https://getcomposer.org/installer | php \
  && chmod +x composer.phar && mv composer.phar /usr/local/bin/composer

RUN apk --no-cache add --virtual .build-deps $PHPIZE_DEPS \
  && apk --no-cache add --virtual .ext-deps libmcrypt-dev freetype-dev \
  libjpeg-turbo-dev libpng-dev libxml2-dev msmtp bash openssl-dev pkgconfig \
  && docker-php-source extract \
  && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ \
                                   --with-png-dir=/usr/include/ \
                                   --with-jpeg-dir=/usr/include/ \
  && docker-php-ext-install gd mcrypt mysqli pdo pdo_mysql zip opcache \
  && pecl install mongodb redis xdebug \
  && docker-php-ext-enable mongodb \
  && docker-php-ext-enable redis \
  && docker-php-ext-enable xdebug \
  && docker-php-source delete \
  && apk del .build-deps

WORKDIR /var/www/html

COPY composer.json composer.lock ./
RUN composer install --no-scripts --no-autoloader

COPY . .
RUN chmod +x artisan

RUN composer dump-autoload --optimize && composer run-script post-install-cmd

CMD php artisan serve --host 0.0.0.0 --port 5001

当我构建时,这似乎工作得很好。我看到下载的依赖项,我看到在输出中生成了自动加载文件。但是,一旦构建完成,供应商文件夹实际上并不存在。我猜这一切都是在一个中间容器中完成的,然后被移除了?所以当我运行 docker-compose up 时,我得到: 致命错误:require(): Failed opening required ‘/var/www/html/bootstrap/../vendor/autoload.php’

该线程似乎指出了问题 - 可能 - 但并没有真正提供解决方案: Composer install doesn’t install packages when running in Dockerfile

原文由 JBxOnline 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

这需要对 Docker 的新手进行大量挖掘 :) 感谢 @iurii-drozdov 用关于 docker-compose.yml 的评论为我指明了正确的方向。

在我的 docker-compose.yml 中,我将主机工作目录安装到 /var/www/html 中。这发生在构建之后。因此,composer 运行了安装,在构建时正确安装了所有依赖项,然后,在运行 docker-compose up 时,我将主机目录安装到容器中并清除了所有这些更改。

解决方案是在安装卷 运行 composer install。只需在启动容器后执行该容器即可 - 运行 composer 和任何其他包管理器 - 然后最终运行 Web 服务器。

但是,我找到了一个更简洁的解决方案。我将 Dockerfile 中的最终 CMD 更改为:

 CMD bash -c "composer install && php artisan serve --host 0.0.0.0 --port 5001"

这将运行 composer install 并将 Web 服务器作为 docker-compose up 的最后一部分。

归功于这里的解决方案: Docker - 安装卷后执行命令

原文由 JBxOnline 发布,翻译遵循 CC BY-SA 3.0 许可协议

你也可以使用 官方的 dockerhub composer 镜像。

这是一个多阶段构建的示例,composer 首先在单独的容器中运行。生成的 /app/vendor 被复制到最终图像中您想要的任何位置。

 FROM composer as builder
WORKDIR /app/
COPY composer.* ./
RUN composer install
...
FROM php:7.1-fpm-alpine
...
COPY --from=builder /app/vendor /var/www/vendor

原文由 Phil 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题