我第一次尝试使用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