在Elastic Beanstalk的Docker中部署时间命令

我有一个在Docker中运行的Django服务,我将其部署到AWS Elastic Beanstalk。

我想在部署时运行我的数据库迁移

如果我将EB部署为“Python项目”,则可以在.ebextensions使用以下.ebextensions

 $ cat .ebextensions/01run.config container_commands: 01migrate: command: "python manage.py migrate --noinput" leader_only: true 

但是, container_commands是EC2实例 – 它在Docker容器中 ,我有我的代码等。

我已经看过的东西

  • 我不能将它添加到我的Dockerfile ,因为应用迁移是关于在附加的RDS实例上运行(由环境提供的) – 而不是真正的“构buildDocker镜像的一部分”

  • 似乎没有什么有用的,我可以添加到Dockerrun.aws.json

到目前为止我已经确定的Hacky选项

  • 我也许可以识别我的container_commands的Docker图像名称,然后执行docker run -ti $container-name python manage.py migrate等,但不知道如何和感觉非常哈克

  • 我可以手工运行迁移

  • 我可以用CMD $scriptreplaceCMD gunicorn $etc ,其中$script应用迁移,然后启动gunicorn。

    • 这是我迄今为止确定的最不可怕的事情,以及我将要做的一个权宜之计。
    • 这意味着“每次启动实例时都会尝试应用迁移”,这不会让我感到舒适和快乐。

想法非常欢迎,请!

我认为在Dockerfile中使用ENTRYPOINT可能会解决您的问题。

要么你可以在你的容器映像中有一个脚本(它负责数据库迁移,启动web服务器和其他完整性检查),并在Dockerfile的ENTRYPOINT中调用该脚本。

 ADD run_all /opt/bin/ ENTRYPOINT ["/opt/bin/run_all"] 

这样,只有在创build该图像的容器时才执行该脚本。

或者使用ENTRYPOINT运行这两个命令(Python manage.py migrate && httpd start)