【问题标题】:APP_SERVER env var not found when deploying with EasyDeploy使用 EasyDeploy 部署时未找到 APP_SERVER env var
【发布时间】:2020-03-25 10:31:53
【问题描述】:

部署脚本尝试安装资产时出现此错误:

(安装 PHP 7.2,Symfony 4.4)

[Symfony\Component\Process\Exception\ProcessFailedException]
The command "ssh -A root@vps.net -p 21 '(export APP_ENV=prod; cd /var/www-deploy/site.com/releases/20191129224025
&& php /var/www-deploy/site.com/releases/20191129224025/bin/console assets:install /var/www-deploy/site.com/releases/20191129224025/public --symlink --no-debug --env=prod)'" failed.
Exit Code: 1(General error)
Working directory: /Users/coil/Sites/site.com
Output:
================
Error Output:
================
In EnvVarProcessor.php line 162:
Environment variable not found: "APP_SERVER".

我已经把.env文件放到了共享文件中,所以在创建release目录的时候就复制了,这个文件就在目录里面。

public function configure(): DefaultConfiguration
{
    return $this->getConfigBuilder()
        // ...
        ->sharedFilesAndDirs(['.env'])
        // ...
}

我还尝试将环境变量放在部署用户的.bashrc 文件中:

printenv | grep -i app
APP_DEBUG=0
APP_SECRET=whatever
APP_ENV=prod
APP_SERVER=prod

所以,我不明白,为什么仍然找不到环境变量。以及为什么不从.env 文件中获取它们。 如果我中断部署并且我在服务器上手动运行相同的命令,它运行良好。谢谢。

[编辑 2019-11-30] 我想我明白了,运行命令时,有一个 APP_ENV 的导出完成。而且,如果应用程序检测到这个环境变量,它将跳过.env file。所以,我需要避免设置这个环境变量,或者我必须设置所有而不是只设置一个。

【问题讨论】:

    标签: php deployment environment-variables symfony4


    【解决方案1】:

    [编辑 2021-02-13] 我已修复 bin/console 文件并删除了“hack”。我没有测试APP_ENV var,而是测试了EasyDebug 未设置的APP_SECRET

    if (!isset($_SERVER['APP_SECRET'])) {
        (new Dotenv())->load(__DIR__.'/../.env');
    }
    

    旧解决方案:

    它现在可以在src/Configuration/DefaultConfiguration.php 中进行以下修改:

    } elseif (4 === $symfonyMajorVersion || (3 === $symfonyMajorVersion && 4 >= $symfonyMinorVersion)) {
        $this->_symfonyEnvironmentEnvVarName = 'APP_ENV';
    

    我已将一个未知的环境变量传递给 Symfony:

    $this->_symfonyEnvironmentEnvVarName = 'APP_FAKE_ENV';
    

    所以.env 文件不再被忽略。我认为根据应用程序的设置,缺少设置或不设置此环境变量的选项。我将尝试对捆绑包进行 PR。

    所以,由于捆绑包尚未修改,我修改了私有属性,以使命令使用我的 .env 文件而不是环境变量:

    /**
     * @see https://stackoverflow.com/q/1762135/633864
     */
    private function forceEnvironmentEnvVarName(DefaultConfiguration $configuration): DefaultConfiguration
    {
        $myClassReflection = new ReflectionClass(get_class($configuration));
        $symfonyEnvironmentEnvVarName = $myClassReflection->getProperty('_symfonyEnvironmentEnvVarName');
        $symfonyEnvironmentEnvVarName->setAccessible(true);
        $symfonyEnvironmentEnvVarName->setValue($configuration, 'FAKE_APP_ENV');
        $symfonyEnvironmentEnvVarName->setAccessible(false);
    
        return $configuration;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 2018-09-24
      • 2012-06-16
      • 2019-11-05
      • 2022-01-14
      • 1970-01-01
      • 2017-08-10
      • 2016-06-02
      • 2020-04-08
      相关资源
      最近更新 更多