在AWS Elastic Beanstalk上使用Docker进行Django迁移

MrC*_*les 3 amazon-web-services docker amazon-elastic-beanstalk

我在AWS Elastic Beanstalk上的单个docker容器中运行了一个django应用程序.我无法让它正常运行迁移,它总是看到旧的docker镜像并尝试从中运行迁移(但它没有最新的文件).

.ebextensions使用我的EBS源包(包含Dockerrun.aws.json文件和.ebextensions目录的zip)打包一个目录.它有一个setup.config文件,如下所示:

container_commands:
  01_migrate:
    command: "CONTAINER=`docker ps -a --no-trunc | grep aws_beanstalk | cut -d' ' -f1 | head -1` && docker exec $CONTAINER python3 manage.py migrate"
    leader_only: true
Run Code Online (Sandbox Code Playgroud)

对此SO问题的评论之后部分建模.

我已经验证,如果我只是第二次重新部署应用程序它可以工作,因为这次上一个运行的映像将具有更新的迁移文件.

有谁知道如何在.ebextensions脚本中访问最新的docker镜像或最新运行的容器?

Edw*_*uel 8

基于有关在Linux服务器自定义软件的 AWS文档,container_commands将在部署应用程序之前执行.

您可以使用该container_commands键为容器执行命令.命令container_commands按名称按字母顺序处理.它们在设置应用程序和Web服务器并且已提取应用程序版本文件之后但在部署应用程序版本之前运行.他们还可以访问环境变量,例如您的AWS安全凭证.此外,您可以使用leader_only.选择一个实例作为Auto Scaling组的领导者.如果该leader_only值设置为true,则该命令仅在标记为leader的实例上运行.

这里看看我的答案.它在不同的app部署状态下运行一些命令并给出命令结果.

因此,您的问题解决方案可能是创建一个post app deployment hook.

.ebextensions/00_post_migrate.config

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/10_post_migrate.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      if [ -f /tmp/leader_only ]
      then
        rm /tmp/leader_only
        docker exec `docker ps --no-trunc -q | head -n 1` python3 manage.py migrate
      fi

container_commands:
  01_migrate:
    command: "touch /tmp/leader_only"
    leader_only: true
Run Code Online (Sandbox Code Playgroud)