Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当我使用docker多级构建为生产构建应用程序时,如何删除composer-dev依赖关系?_Php_Docker_Dependencies_Composer Php - Fatal编程技术网

Php 当我使用docker多级构建为生产构建应用程序时,如何删除composer-dev依赖关系?

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

我正在使用多级构建作为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
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安装--无开发--优化自动加载程序
在mt
Dockerfile
中的哪个位置是最好的位置?同样,一旦我运行了
composer安装--dev
我会排除非开发编写程序吗通过
composer安装的依赖项--无需开发--优化autoloader
,无需更改阶段?我对docker没有太多的经验,但您可能应该具有
composer安装$(printenv composer\u FLAGS)
的效果,然后使用composer\u FLAGS创建容器=“无开发--优化自动加载器”用于生产。