我正在尝试 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 许可协议
这需要对 Docker 的新手进行大量挖掘 :) 感谢 @iurii-drozdov 用关于 docker-compose.yml 的评论为我指明了正确的方向。
在我的 docker-compose.yml 中,我将主机工作目录安装到 /var/www/html 中。这发生在构建之后。因此,composer 运行了安装,在构建时正确安装了所有依赖项,然后,在运行 docker-compose up 时,我将主机目录安装到容器中并清除了所有这些更改。
解决方案是在安装卷 后 运行 composer install。只需在启动容器后执行该容器即可 - 运行 composer 和任何其他包管理器 - 然后最终运行 Web 服务器。
但是,我找到了一个更简洁的解决方案。我将 Dockerfile 中的最终 CMD 更改为:
这将运行 composer install 并将 Web 服务器作为 docker-compose up 的最后一部分。
归功于这里的解决方案: Docker - 安装卷后执行命令