在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 $script
replaceCMD 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)