使用 Docker 向 Laravel 的工匠公开 Elastic Beanstalk 环境变量

Posted

技术标签:

【中文标题】使用 Docker 向 Laravel 的工匠公开 Elastic Beanstalk 环境变量【英文标题】:Exposing Elastic Beanstalk environment variables to Laravel's artisan using Docker 【发布时间】:2015-04-21 00:11:27 【问题描述】:

我第一次尝试使用 Elastic Beanstalk 将我的应用程序部署到生产环境,并且我已经创建了一个 RDS 实例以及我的 Elastic beanstalk 应用程序。由于我的应用程序使用 php5-FPM,我必须像这样在 Dockerfile 中公开这些环境变量:

RUN echo 'env[RDS_HOSTNAME] = $RDS_HOSTNAME' >> /etc/php5/fpm/pool.d/www.conf
RUN echo 'env[RDS_PORT] = $RDS_PORT' >> /etc/php5/fpm/pool.d/www.conf
RUN echo 'env[RDS_DB_NAME] = $RDS_DB_NAME' >> /etc/php5/fpm/pool.d/www.conf
RUN echo 'env[RDS_USERNAME] = $RDS_USERNAME' >> /etc/php5/fpm/pool.d/www.conf
RUN echo 'env[RDS_PASSWORD] = $RDS_PASSWORD' >> /etc/php5/fpm/pool.d/www.conf

这很好用,我的 PHP 脚本可以访问我的 RDS 数据库。不过我在部署的时候还需要迁移数据库,所以我在Dockerfile添加了这一行:

# Run artisan migrations
RUN php /var/www/artisan migrate --force

这会失败,因为命令行上不存在 PHP 的 RDS 环境变量。我通过在artisan 脚本顶部执行die(var_dump($_SERVER)); 确认了这一点,并且正如我所料,RDS 环境变量不存在。

为了尝试将环境变量获取到 PHP CLI,我尝试在我的 Dockerfile 中执行此操作:

RUN echo 'RDS_HOSTNAME=$RDS_HOSTNAME' >> /etc/environment
RUN echo 'RDS_PORT=$RDS_PORT' >> /etc/environment
RUN echo 'RDS_DB_NAME=$RDS_DB_NAME' >> /etc/environment
RUN echo 'RDS_USERNAME=$RDS_USERNAME' >> /etc/environment
RUN echo 'RDS_PASSWORD=$RDS_PASSWORD' >> /etc/environment
RUN source /etc/environment

不过,环境变量也不存在。

如何让 PHP 命令行解释器访问我的 RDS 环境变量?

我能想到的唯一其他选择是在我的应用程序配置中硬编码我的 RDS 凭据,我相信你明白这是我不想做的事情。

【问题讨论】:

你解决了这个问题吗?这几天我一直在苦苦挣扎 我相信我最终使用了.ebextensions 配置目录来运行我的迁移。环境变量存在于实际主机上,只是不在 Docker 容器内。 【参考方案1】:

您可以在 beanstalk 应用程序的配置中设置环境变量。转到您的应用程序,单击左侧菜单上的配置,然后查找软件配置部分并单击编辑图标,一个齿轮状的东西。然后,您可以在此页面上添加所需的所有环境变量并随时更改它们。我相信您也可以在 .elasticbeanstalk/config.yml 中执行此操作,但我通常只是从 Web 界面执行此操作。

【讨论】:

【参考方案2】:

mod_env 很可能不会将这些变量传递给您的应用程序。在您的 /var/apache2/sites-enabled/000-default.conf 或其他负责您的应用程序的文件中,您需要指定应传递的所有环境参数,如下例所示:

<VirtualHost *:80>
    DocumentRoot "$APP_DOCUMENT_ROOT"

    <Directory "$APP_DOCUMENT_ROOT">
        AllowOverride AuthConfig FileInfo Indexes Limit Options=All,MultiViews
        Options FollowSymLinks MultiViews
        Require all granted
    </Directory>

    CustomLog $APACHE_LOG_DIR/access.log combined
    ErrorLog $APACHE_LOG_DIR/error.log

    #here the magic begins:
    PassEnv APP_RUN_MODE
    PassEnv RDS_HOSTNAME
    PassEnv RDS_PORT
    PassEnv RDS_DB_NAME
    PassEnv RDS_USERNAME
    PassEnv RDS_PASSWORD
</VirtualHost>

如你所见——最重要的是PassEnv 命令。

您可以创建一个名为000-default.conf 的文件并将其放入项目中的docker 文件夹中。然后添加到Dockerfile

ADD docker/000-default.conf /etc/apache2/sites-available/000-default.conf

【讨论】:

以上是关于使用 Docker 向 Laravel 的工匠公开 Elastic Beanstalk 环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 工匠命令不起作用

Laravel 5 - Php 工匠语法错误

克隆 laravel 项目后无法使用工匠

我想从 laravel 中的 vue.js 代码运行工匠命令

向 docker-compose.yml 公开随机端口

如何在没有工匠的情况下运行 laravel 迁移(使用代码)