2017-06-25 16 views
0

現在、私のDjango APIプロジェクトの1つをドッキングしています。これはデータベースとしてpostgresを使用します。私はDocker CloudをCIとして使用していますので、テストを構築し、lintして実行することができます。Dockerクラウド自動テストcant findサービス

私は、次のDockerFile

# Start with a python 3.6 image 
FROM python:3.6 

ENV PYTHONUNBUFFERED 1 
ENV POSTGRES_USER postgres 
ENV POSTGRES_PASSWORD xxx 
ENV DB_HOST db 

RUN mkdir /code 

ADD . /code/ 

WORKDIR /code 

RUN pip install -r requirements.txt 

RUN pylint **/*.py 

# First tried running tests from here. 

RUN python3 src/manage.py test 

で始めたが、ユニットテストを実行するときDjangoは任意のデータベースに接続カントとしてこのDockerFileは常に失敗し、PostgresのインスタンスがこのDockerfileで実行されていないようjustsは、次のエラーで失敗します

django.db.utils.OperationalError: could not translate host name "db" 
to address: Name or service not known 

は、その後、私はあなたがスタックを説明し、各ビルドでいくつかのコマンドを実行するために、ドッキングウィンドウ-compose.text.ymlファイルを使用することができますドッカークラウドで「オートテスト」と呼ばれるものを発見しました。これは私がテストを実行するのに必要なもののように思えました。私はDjangoイメージを構築し、既存のpostgresイメージを参照してテストを実行することができました。

私はDockerFileから

RUN python3 src/manage.py test 

を削除し、次のドッキングウィンドウ-compose.test.ymlファイルを作成しました。

その後
version: '3.2' 

services: 
    db: 
    image: postgres:9.6.3 
    environment: 
     - POSTGRES_USER=$POSTGRES_USER 
     - POSTGRES_PASSWORD=$POSTGRES_PASSWORD 

    sut: 
    build: . 
    command: python src/manage.py test 
    environment: 
     - POSTGRES_USER=$POSTGRES_USER 
     - POSTGRES_PASSWORD=$POSTGRES_PASSWORD 
     - DB_HOST=db 
    depends_on: 
     - db 

私がテストをすべて実行し、すべてのパス、ローカル

docker-compose -f docker-compose.test.yml build 

docker-compose -f docker-compose.test.yml run sut 

を実行します。

私はGithubに変更をプッシュし、Dockerクラウドはそれを構築します。ビルド自体は成功しますが、自動テストは、ドッキングウィンドウ-compose.test.ymlファイルを使用すると、次のエラーで失敗します。DBサービスが開始またはドッカークラウド上で起動するには遅すぎるされてイマイチのよう

django.db.utils.OperationalError: could not connect to server: 
    Connection refused 
    Is the server running on host "db" (172.18.0.2) and accepting 
    TCP/IP connections on port 5432? 

だから、そうです私のローカルマシンと比較して?

ちょっとグーグルした後、私はこれを見つけました。https://docs.docker.com/compose/startup-order/は、コンテナが実際にお互いが100%の準備ができていないと言っています。その後、本当に必要な場合は、ポストグルを待つラッパースクリプトを書くことをお勧めします。

私は指示に従い、wait-for-postgres.shスクリプトを使用しました。

ジューシー一部:

until psql -h "$host" -U "postgres" -c '\l'; do 
    >&2 echo "Postgres is unavailable - sleeping" 
    sleep 1 
    done 

command: python src/manage.py test 

から

command: ["./wait-for-postgres.sh", "db", "python", "src/manage.py", 
"test"] 

に私のドッキングウィンドウ-compose.test.ymlでコマンドを交換し、私は、その後のGithubとドッカーにプッシュ雲が吹き始めます。画像を構築する作業は終了しましたが、自動テストは永久にポストグルを待つだけです(私は10分間待ってからDocker Cloudのビルドプロセスを手動でシャットダウンしました)。

今日はGoogle- 「Dockerize Django」のチュートリアルでは、単体テストについては言及していません。

私はDockerを使ってDjangoユニットテストを完全に間違って実行していますか?

私はそれがローカルで完璧にうまく動作するとは思えますが、Docker Cloudがそれを実行すると失敗します!

答えて

0

ファイルのドッカー作成バージョンを3.2から2.1にダウングレードし、healthcheckを使用して修正したようです。

healthcheckオプションを使用すると、配列を渡す必要があるため、depends_on節に構文エラーが発生します。これはバージョン3.2

でサポートされている。しかし、ここで

version: '2.1' 

services: 
    db: 
    image: postgres:9.6.3 
    environment: 
     - POSTGRES_USER=$POSTGRES_USER 
     - POSTGRES_PASSWORD=$POSTGRES_PASSWORD 
    healthcheck: 
     test: ["CMD-SHELL", "psql -h 'localhost' -U 'postgres' -c 
      '\\l'"] 
     interval: 30s 
     timeout: 30s 
     retries: 3 

sut: 
    build: . 
    command: python3 src/manage.py test 
    environment: 
    - POSTGRES_USER=$POSTGRES_USER 
    - POSTGRES_PASSWORD=$POSTGRES_PASSWORD 
    - DB_HOST=db 
    depends_on: 
    // Does not work in 3.2 
    db: 
     condition: service_healthy 
に動作します私の新しいドッキングウィンドウ-compose.test.ymlですされていない理由は考えない