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

我在AWS Elastic Beanstalk上的一个Docker容器中运行了一个django应用程序。 我不能让它正常运行迁移,它总是看到旧的docker图像,并尝试从那里运行迁移(但它没有最新的文件)。

我用我的EBS源码包(一个包含Dockerrun.aws.json文件和.ebextensions目录的zip)打包一个.ebextensions目录。 它有一个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 

关于这个SO问题的评论是部分build模的。

我已经validation,如果我再次重新部署应用程序,它可以工作 ,因为这次以前的运行映像将具有更新的迁移文件。

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

根据AWS上有关在Linux服务器上定制软件的文档, container_commands将在应用程序部署之前执行。

您可以使用container_commands键为您的容器执行命令。 container_commands中的命令按字母顺序按名称处理。 它们在应用程序和Web服务器已经build立并且应用程序版本文件已经被提取之后,但是在应用程序版本被部署之前运行 。 他们还可以访问诸如AWS安全证书等环境variables。 另外,你可以使用leader_only 。 一个实例被选为Auto Scaling组的领导者。 如果leader_only值设置为true ,则该命令仅在标记为首领的实例上运行。

在这里看看我的回答。 它在不同的应用程序部署状态下运行一些命令并给出命令结果。

所以,你的问题解决scheme可能是创build一个后应用程序部署钩子

.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 

我正在使用另一种方法。 我所做的是基于新构build的映像运行容器,然后从Elastic Beanstalk传入环境variables,然后在该容器中运行自定义命令。 完成该命令后,它将自行移除并继续进行部署。

所以这是我放在.ebextensions/scripts/container_command.sh (确保你replace<>中的所有内容):

 #!/bin/bash COMMAND=$1 EB_CONFIG_DOCKER_IMAGE_STAGING=$(/opt/elasticbeanstalk/bin/get-config container -k <environment_name>_image) EB_SUPPORT_FILES=$(/opt/elasticbeanstalk/bin/get-config container -k support_files_dir) # build --env arguments for docker from env var settings EB_CONFIG_DOCKER_ENV_ARGS=() while read -r ENV_VAR; do EB_CONFIG_DOCKER_ENV_ARGS+=(--env "${ENV_VAR}") done < <($EB_SUPPORT_FILES/generate_env) docker run --name=shopblender_pre_deploy -d \ "${EB_CONFIG_DOCKER_ENV_ARGS[@]}" \ "${EB_CONFIG_DOCKER_IMAGE_STAGING}" docker exec shopblender_pre_deploy ${COMMAND} # clean up docker stop shopblender_pre_deploy docker rm shopblender_pre_deploy 

现在,您可以使用此脚本来执行对稍后将部署的容器的任何自定义命令。

像这样.ebextensions/container_commands.config

 container_commands: 01-command: command: bash .ebextensions/scripts/container_command.sh "php app/console doctrine:schema:update --force --no-interaction" &>> /var/log/database.log leader_only: true 02-command: command: bash .ebextensions/scripts/container_command.sh "php app/console fos:elastica:reset --no-interaction" &>> /var/log/database.log leader_only: true 03-command: command: bash .ebextensions/scripts/container_command.sh "php app/console doctrine:fixtures:load --no-interaction" &>> /var/log/database.log leader_only: true 

这样你也不用担心你最新开始的容器是什么,这是上述解决scheme的问题。