Php 当我使用docker多级构建为生产构建应用程序时,如何删除composer-dev依赖关系?
我正在使用多级构建作为CI/CD管道将我的php应用程序构建到Docker映像中:Php 当我使用docker多级构建为生产构建应用程序时,如何删除composer-dev依赖关系?,php,docker,dependencies,composer-php,Php,Docker,Dependencies,Composer Php,我正在使用多级构建作为CI/CD管道将我的php应用程序构建到Docker映像中: FROM etable/php7.2-dev as build COPY . /var/www/html/ RUN composer install --dev RUN echo "Run unit tests" && ./vendor/bin/phpunit RUN echo "Remove unit tests" && rm -rf /var/www/html/tests R
FROM etable/php7.2-dev as build
COPY . /var/www/html/
RUN composer install --dev
RUN echo "Run unit tests" && ./vendor/bin/phpunit
RUN echo "Remove unit tests" && rm -rf /var/www/html/tests
RUN echo "Remove webpack" && rm -rf webpack.mix.js
FROM etable/php7.2
RUN mkdir /usr/share/myapp
WORKDIR /usr/share/myapp
COPY --from=build /var/www/html/ .
RUN chown www-data:www-data /usr/share/myapp \
&& find /usr/share/myapp -type f -exec chmod 644 {} \
&& find /path/to/laravel -type d -exec chmod 755 {}
WORKDIR /var/www/html
VOLUME /var/www/html
但是在阶段构建中,我安装了开发依赖项,以便运行我的单元测试。因为在composer.json
上,phphphUnit被定义为开发依赖项:
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"license": "MIT",
"require": {
"php": "^7.2",
"fideloper/proxy": "^4.0",
"laravel/framework": "^6.2",
"laravel/tinker": "^2.0"
},
"require-dev": {
"facade/ignition": "^1.4",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^3.0",
"phpunit/phpunit": "^8.0"
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
"database/seeds",
"database/factories"
]
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
}
}
(我使用默认的laravel作为示例并测试多阶段构建,但这适用于任何使用composer并将phpunit作为开发依赖项的php项目。)
但我有这个问题。在我运行php单元测试之后,我不再需要composer-dev依赖项,因此我需要在进入下一阶段之前将它们删除,因为我已经安装了依赖项,因此重新下载它们将使构建过程变慢
那么,我如何使用composer删除开发依赖项,并保留生产依赖项呢 由于没有人回答这个问题,我将提供一个更有力的解释。首先,对术语做一点澄清。您不应该从composer项目中删除开发依赖项,您应该首先在没有这些依赖项的情况下部署它。您可以通过提交composer.lock文件并使用
composer安装--no dev--optimize autoloader
部署提交(最好是标记)来实现这一点。这将生成一个供应商文件夹,其中包含所有锁定的包版本(来自composer.lock),而不包含开发依赖项。以防有任何混乱,您不应该将您的供应商文件夹提交给VCS。composer安装--无开发iirc…因此命令composer安装--无开发--优化自动加载程序
在mtDockerfile
中的哪个位置是最好的位置?同样,一旦我运行了composer安装--dev
我会排除非开发编写程序吗通过composer安装的依赖项--无需开发--优化autoloader
,无需更改阶段?我对docker没有太多的经验,但您可能应该具有composer安装$(printenv composer\u FLAGS)
的效果,然后使用composer\u FLAGS创建容器=“无开发--优化自动加载器”用于生产。