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

Kri*_*ass 9 python django amazon-web-services docker

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

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

如果我将EB部署为"Python项目",我可以在我的内容中使用以下内容.ebextensions:

$ cat .ebextensions/01run.config 
container_commands:
    01migrate:
        command: "python manage.py migrate --noinput"
        leader_only: true
Run Code Online (Sandbox Code Playgroud)

但是,container_commands对于EC2实例 - 它在Docker容器中,我有我的代码等.

我已经看过的东西了

  • 我不能只将它添加到我的Dockerfile,因为应用迁移是关于在附加的RDS实例(由环境提供)上操作 - 不是真正"构建Docker镜像的一部分"

  • 似乎没有任何有用的东西我可以添加 Dockerrun.aws.json

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

  • 我或许可以在我的内部识别Docker图像名称container_commands然后执行docker run -ti $container-name python manage.py migrate等等,但不知道它是如何以及它感觉非常hacky

  • 我可以手动运行迁移

  • 我可以代替CMD gunicorn $etcCMD $script,其中$script应用迁移,然后开始gunicorn.

    • 这是迄今为止我发现的最不可怕的事情,以及我将要做的权宜之计.
    • 这意味着"每次启动实例时都尝试应用迁移",这不会让我感到舒服和快乐.

非常欢迎您的想法!

VDR*_*VDR 0

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

您可以在容器映像中编写一个脚本(负责数据库迁移、启动网络服务器和其他健全性检查),并在 Dockerfile ENTRYPOINT中调用该脚本。

ADD run_all /opt/bin/
ENTRYPOINT ["/opt/bin/run_all"]
Run Code Online (Sandbox Code Playgroud)

这样,仅当您创建该映像的容器时才会执行脚本。

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