gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:21:17 26 4
gpt4 key购买 nike

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

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

如果我作为“Python 项目”部署到 EB,我的 .ebextensions 中可以包含以下内容:

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

但是,container_commands 适用于 EC2 实例 - 在 Docker 容器内我有我的代码等。

我已经看过的东西

  • 我不能只将它添加到我的 Dockerfile 中,因为应用迁移就是在附加的 RDS 实例(由环境提供)上操作 - 并不是真正“构建Docker 镜像”

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

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

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

  • 我可以手动运行迁移

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

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

非常欢迎您提出想法!

最佳答案

您可以像这样在 .ebextensions 中添加部署后脚本:

files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/10_migrate.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
if [ -f /tmp/leader_only ]; then
echo "Running Migrations"
container_id=`docker ps -q --no-trunc --filter label="com.amazonaws.ecs.container-name=MY_CONTAINER_NAME" | head -n 1`
docker inspect $container_id
docker exec $container_id /entrypoint.sh python manage.py migrate --noinput
fi
"/opt/elasticbeanstalk/hooks/appdeploy/post/90_rm_leader_only.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
if [ -f /tmp/leader_only ]; then
echo "Deleting leader_only file"
rm /tmp/leader_only
fi
container_commands:
01_touch_the_leader:
command: |
#!/usr/bin/env bash
touch /tmp/leader_only
leader_only: true

我只包括了领导者,以防您可能正在使用负载平衡环境,它不会同时在多台服务器上运行迁移。这也可以用于 collectstatic 命令。

关于python - 在 Elastic Beanstalk 上的 Docker 中部署时命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30322208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com