2016-05-06 25 views
4

我是新手在碼頭構成和我有一個碼頭與我的Django實例和MySQL數據庫。我想創建一個自動配置的容器,它只在第一次碼頭運行時運行命令。在此命令,我想執行以下任務:初始化Django應用程序與碼頭構成

  1. 進行初始數據庫遷移
  2. 創建管理員超級用戶
  3. 導入一個MySQL備份到數據庫

該系統後應繼續啓動django測試網絡服務器。

有沒有什麼辦法可以告訴docker-compose在第一次運行時運行命令還是在django中有任何替代方法來控制系統是否已經配置和更新?

爲了澄清這裏是我的dockfile和碼頭工人,compose.yml:

FROM python:3.4 
ENV PYTHONUNBUFFERED 1 
RUN mkdir /code 
WORKDIR /code 
ADD requirements.txt /code/ 
RUN pip install -r requirements.txt 
ADD . /code/ 

#################### 

version: '2' 
services: 
db: 
    image: "mysql:5.6" 
    ports: 
    - 3306:3306 
    environment: 
    MYSQL_ROOT_PASSWORD: xxxxxx 
    MYSQL_DATABASE: xxxxxx 
    MYSQL_USER: xxxxx 
    MYSQL_PASSWORD: xxxxxxx 
web: 
    build: . 
    command: python manage.py runserver 0.0.0.0:8000 
    volumes: 
    - .:/code 
    ports: 
    - "8000:8000" 
    depends_on: 
    - db 

感謝。

+0

你可以推出你自己的Dockerfile來運行這些命令 –

+0

@ cricket_007我真的不知道dockerfile的一個簡單修改是否會起作用,因爲我使用數據庫作爲我的django中的獨立映像。 – rdiaz82

+0

我明白這一點。我在說你用一個運行腳本和導入的圖層來創建數據庫容器(與django分開)。在你擁有一張圖片之後,Docker並不是真的被設計成「只運行一次」(即是有狀態的)。至少,這是我的經驗 –

回答

5

繼@ cricket_007的評論後,終於找到了一個棘手的解決方案來解決這個問題。我爲數據庫服務和我的Web服務創建了一個sh腳本。另外,我在我的文件夾web_local.version和web_server.version中創建了兩個版本文件。

web_local.version已添加到我的.gitignore中,因爲此文件用於存儲當前應用程序版本。

start_web.sh腳本是一個簡單的腳本,用於比較文件夾是否包含web_local.version文件。在這種情況下,項目已經過去配置,並且腳本檢查當前應用版本是否與服務器版本相比更新。在所有情況都是最新的情況下,只需運行Web服務器,否則運行遷移以更新模型,然後運行Web服務器。

下面是引用web_start.sh腳本:

#!/bin/bash 

FILE="web_local.version" 

if [ -f "$FILE" ]; 
then 
    echo "File $FILE exist." 
    if diff ./web_server.version ./web_local.version > /dev/null; 
    then 
     echo "model version up to date :)" 
    else 
     echo "model updated!!" 
     python manage.py migrate 
     cp ./web_server.version ./$FILE 
    fi 
else 
    echo "File $FILE does not exist" 
    sleep 10 #added because the first time db take a long time to init and the script doesn't wait until db is finished 
    cp ./web_server.version ./$FILE 
    python manage.py migrate 
fi 
python manage.py runserver 0.0.0.0:8000 

我想有更正式的解決方案,但這個方案是我的情況下的功能,因爲它可以讓我們的團隊保持同樣的模擬數據庫和同模型通過git同步,我們有一個零時間配置環境,只需一個命令即可運行。