簡體   English   中英

在AWS Elastic Beanstalk上使用Docker進行Django遷移

[英]Django migrations with Docker on AWS Elastic Beanstalk

我在AWS Elastic Beanstalk上的單個docker容器中運行了一個django應用程序。 我無法讓它正常運行遷移,它總是看到舊的docker鏡像並嘗試從中運行遷移(但它沒有最新的文件)。

我打包.ebextensions目錄與我的EBS源束(含有Dockerrun.aws.json文件和.ebextensions DIR拉鏈)。 它有一個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問題的評論之后部分建模。

我已經驗證,如果我只是第二次重新部署應用程序它可以工作 ,因為這次上一個運行的映像將具有更新的遷移文件。

有誰知道如何在.ebextensions腳本中訪問最新的.ebextensions鏡像或最新運行的容器?

基於有關在Linux服務器自定義軟件的 AWS文檔,將在部署應用程序之前執行container_commands

您可以使用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

我正在使用另一種方法。 我所做的是基於新構建的映像運行容器,然后從Elastic Beanstalk傳入環境變量並在該容器中運行自定義命令。 完成該命令后,它將自行刪除並繼續部署。

所以這是我放在.ebextensions/scripts/container_command.sh (確保替換<>中的所有內容):

#!/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

這樣您也不必擔心最新啟動的容器是什么,這是上述解決方案的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM