将Elastic Beanstalk环境变量暴露给Laravel';使用Docker的工匠


Exposing Elastic Beanstalk environment variables to Laravel's artisan using Docker

我第一次尝试使用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凭据,我相信你知道这是我不想做的事情。

您可以在beanstall应用程序的配置中设置环境变量。转到您的应用程序,单击左侧菜单上的"配置",然后查找"软件配置"部分,然后单击编辑图标,一个看起来像齿轮的东西。在这个页面上,您可以添加所有需要的环境变量,并随时更改它们。我相信你也可以在你的.aelasticbeanstall/config.yml中做到这一点,但我通常只是从网络界面上做到的。

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