2016-05-06 4 views
4

私はdocker-composeの初心者です。私はdjangoインスタンスとmysqlデータベースを持つドッカーを持っています。最初のドッカーの実行時にのみコマンドを実行する自己自動コンテナを作成したいと思います。このコマンドでは、私は次のタスクを実行したいと思います:docker-composeでdjangoアプリを起動する

  1. すると、このシステムべき後のadminスーパー
  2. インポートデータベースにMySQLのバックアップ

を作成する最初のデータベースの移行

  • を作りますdjangoテストWebサーバーの起動を続行します。

    docker-composeに最初に実行されたコマンドを実行するよう指示する方法はありますか?また、システムが既に設定され更新されているかどうかをdjangoで制御する方法はありますか?

    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 
    

    ありがとう:ここに明確にするために

    は私dockfileとドッキングウィンドウ-compose.ymlです。

  • +0

    これらのコマンドを実行するために独自のDockerファイルをロールバックすることができます –

    +0

    @ cricket_007 dockerfileからの独立イメージとしてデータベースを使用しているため、dockerfileの単純な変更が機能するかどうかはわかりません。 – rdiaz82

    +0

    私はそれを理解しています。私はあなたのスクリプトとインポートを実行するレイヤーと(別にdjangoから)データベースコンテナを作ると言っていた。イメージを作成した後、Dockerは実際には「何かを1回だけ実行する」(つまりステートフルになる)ようには設計されていません。少なくとも、それは私の経験です –

    答えて

    5

    @ cricket_007のコメントに続いて、私は最後に問題を解決するためのトリッキーな解決策を見つけました。データベースサービスとWebサービスのためのshスクリプトを作成しました。さらに、私は自分のフォルダに2つのバージョンファイル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で同期されており、1つのコマンドだけで実行するゼロ時間設定環境があります。