在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的问题。
- Docker部署失败的Elastic Beanstalk
- 如何自定义Elastic Beanstalk上的docker run命令?
- 什么导致EB cli将文件名称1(app-123456-654321.zip)与文件名称2(9f1b.zip)打包在一起?
- 在shell脚本中的脚本不在docker中执行
- 如何从ElasticBeanstalk应用程序实例检索正在运行的版本?
- AWS ECS任务 – angular度构build不会停止运行
- ElasticBeanstalk Docker主机networking模式
- AWS ElasticBeanstalk Multidocker未使用正确的Cmd创buildECS任务
- AWS泊坞窗设置 – 无caching标志