【发布时间】: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 容器内。
标签: php laravel amazon-web-services docker amazon-elastic-beanstalk