現在、私の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がそれを実行すると失敗します!