[英]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.