Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS Elastic Beanstalk上Docker的Django迁移_Amazon Web Services_Docker_Amazon Elastic Beanstalk - Fatal编程技术网

Amazon web services AWS Elastic Beanstalk上Docker的Django迁移

Amazon web services AWS Elastic Beanstalk上Docker的Django迁移,amazon-web-services,docker,amazon-elastic-beanstalk,Amazon Web Services,Docker,Amazon Elastic Beanstalk,我有一个django应用程序在AWS Elastic Beanstalk上的单个docker容器中运行。我无法让它正常运行迁移,它总是看到旧的docker映像并尝试从中运行迁移(但它没有最新的文件) 我将.ebextensions目录与我的EBS源代码包(包含dockrun.aws.json文件和.ebextensions目录的zip)打包在一起。它有一个setup.config文件,如下所示: container_commands: 01_migrate: command: "CO

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

我将
.ebextensions
目录与我的EBS源代码包(包含dockrun.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
这部分是根据上的注释建模的

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


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

根据AWS文档,在部署应用程序之前将执行
容器命令

您可以使用
container\u commands
键为您的容器执行命令。
container\u commands
中的命令按名称的字母顺序处理它们在设置应用程序和web服务器后运行并提取应用程序版本文件,但在部署应用程序版本之前运行。他们还可以访问环境变量,如AWS安全凭据。此外,您只能使用
leader\u
。选择一个实例作为自动缩放组中的领导者。如果
leader\u only
值设置为
true
,则该命令仅在标记为leader的实例上运行

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

因此,您的问题解决方案可能是创建应用程序后部署挂钩

.ebextensions/00\u post\u migrate.config


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

这就是我放在
.ebextensions/scripts/container_command.sh中的脚本(请确保替换其中的所有内容):


通过这种方式,您也不必担心最新启动的容器是什么,这是上述解决方案的一个问题。

谢谢-我会尝试一下,然后再报告。您还知道如果命令返回非零状态,这是否会停止部署吗?我不确定。需要先试试。在启动django之前创建一个运行迁移的入口点脚本不是更简单吗?@elssar你是说在Dockerfile本身中?我怎么能让它只在
leader_only
上运行呢?@EdwardSamuel刚刚试了一下,开始工作了!谢谢你的提示。我在EB机器上的
/opt/elasticbeanstalk/hooks/appdeploy/
目录中四处窥探,并从其他脚本中获取了一些其他队列,例如,它们源于一个
common.sh
文件,该文件公开了一些函数,允许您在部署的事件进程中插入跟踪、警告或错误。看起来效果很好,唯一的问题是它似乎没有正式的文档记录,也没有得到AWS的批准,亚马逊可能会在没有通知的情况下改变周围的一切:O
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
#!/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
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