在Dockerfile中运行composer php安装

我正在尝试Dockerize我的laravel应用程序。 该应用程序已经build成,并在混帐,但我.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 

当我build立,这似乎很好。 我看到下载的依赖关系,我看到在输出中生成的自动加载文件。 但是,一旦构build完成,供应商文件夹实际上不在那里。 我猜这一切都是在一个中间的容器里完成的,然后被移走了? 所以当我运行docker-compose时,我得到:致命错误:require():失败打开需要'/var/www/html/bootstrap/../vendor/autoload.php'

这个线程似乎指向的问题 – 可能 – 但并没有真正提供一个解决scheme: Composer安装不会在Dockerfile中运行时安装包

这需要大量的挖掘新的Docker的人:)感谢@ iurii-drozdov指导我正确的方向与关于docker-compose.yml的评论。

在我的docker-compose.yml中,我正在将我的主机工作目录安装到/ var / www / html中。 这是在构build之后发生的。 因此,composer php运行安装,正确安装所有的依赖关系,然后,当运行docker-compose,我正在安装我的主机目录到容器中,并擦除所有这些变化。

解决方法是安装卷运行composer php安装。 直接运行作曲者和任何其他软件包pipe理者,然后最终运行Web服务器,然后直接进入容器就可以做到这一点。

但是,我find了一个更干净的解决scheme。 我把Dockerfile中的最后一个CMD改为:

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

这将运行composer php安装并调出Web服务器作为docker的最后一部分 – 组成。

在这里解决这个问题的方法: Docker – 安装卷后执行命令