2017-12-18 7 views
0

Dockerを使用してDjango Webアプリケーションの開発環境を自分自身で作成しようとしています。
私の質問は、開発のためにどのように設定する必要がありますか?私は、DjangoのdevのサーバーとDBを使用していますDockerfileを作成しました
DockerでDjangoを開発する

  1. 、それは良いのですか?専用のWebサーバーとDBサーバーを別々のコンテナで使用する必要がありますか?
  2. 新しい移行を作成するにはどうすればよいですか? -vを使用してコードをコンテナにマウントしようとしている場合、モデルを変更するには新しいマイグレーションを作成する必要があるため、マウントを書き込み可能にしてコンテナ内からマイグレーションを使用する必要がありますか?他にどんな選択肢がありますか?
  3. 私は、命令をDockerfileに追加することを考えています。これは、移行が変更されていないときにキャッシュを使用するために移行を適用します。これは良い練習ですか?
+0

私はコンテナ内で開発しません。新しいコミットを押す前に、テストを内部で実行してください。 'runserver'を使ってdjangoをvirtualenvでローカルに開発するのは簡単です。 – dahrens

+0

ちょうどヒント - ドッカーの作成を試み、 'web'コンテナを' db'コンテナから分離してください。 – jcfollower

+0

@jcfollowerあなたは精巧にできますか?なぜ私は別の容器を使うべきですか? –

答えて

1

私はかなり多くの場合、Dockerを使ってPythonを開発しています(Flask開発者)。あなたがPyCharmを使用しない限り、Virtualenvsは管理するのが面倒です。

FROM python:3.6 

# Install requirements 
RUN pip install django==VERSION \ 
    package==version 

ADD . /code 
WORKDIR /code 

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] 

localhostコンテナホストファイルに存在しないため、実行

$ docker build -t IMAGE_NAME . 
$ docker run -it \ 
    -p 8000:8000 \ 
    --mount src=$(pwd),target=/code,type=bind \ 
    -e DEBUG=1 \ 
    IMAGE_NAME 

には0.0.0.0とホストを持つことが重要です。 --mount-e DEBUG=1を組み合わせることで、変更時のホットリロードを利用できます。あなたは、このような

DEBUG = os.getenv('DEBUG') or 0 

これは、フラスコの開発を行っているときに私が使用するものであるとしてmanage.py変更する必要があります。

EDITはちょっと、これはすべてのご質問

私はいつも、私はDBのバックエンドを交換することができ、複数のコンテナを行い応答しない場合に実現Iそうしてください。 (

$ docker volumes inspect data 

は、私が先に述べたdocker runコマンドは基本的にコンファイルに書き換えられ...

version: '3' 
services: 
    web: 
    build: . 
    ports: 
     - "8000:8000" 
    environment: 
     - DEBUG=1 
    volumes: 
     - type: bind 
     source: . 
     target: /code 

    db: # This is the host name 
    image: postgress:10.1 
    environment: 
     - POSTGRESS_USER=USERNAME 
     - POSTGRESS_PASSWORD=PASS 
     - POSTGRESS_DB=DBNAME 
    volumes: 
     - data:/var/lib/postgresql/data 

volumes: 
    data: 

あなたはこの例dataで指定されたボリュームを宣言する必要があり、あなたはそれが経由して保存場所を確認することができますドッカーの作成は基本的なAPIを呼び出すだけなので)。あなたは、実際にcomposeを使うのではなく、dockerのCLIを使ってバックグラウンドでpostgressコンテナを起動することができましたが、複数のコンテナで作業する方がはるかに簡単です。明示的に定義されたネットワークがなかったので、コンテナはデフォルトのネットワークを作成し、バインドするだけです。データベースコンテナのホスト名は、dbか、サービスを呼び出すことを決めたものです。だから、あなたのpythonファイルでは、あなたの接続のホスト名としてそれを使う必要があります。

マイグレーションについては、Webコンテナで実行する必要があります。私は実際にDjangoデベロッパーをしていませんが、それがFlaskの移行と似ているなら、私はこれが当てはまると思います。

$ docker exec -it web_container_name/hash /bin/bash 
[email protected]_container_hash# python manage.py makemigrations 
[email protected]_container_hash# python manage.py migrate 

EDIT 2

これらのコマンドを実行している場合、それはあなたの移行を作成する必要がありますし、/codeが実際にあなたのローカルディレクトリにバインドされているので、それはあなたのローカルマシンに保存されます。

+0

答えをありがとう。 Djangoでの移行は、移行ファイルを作成します。コンテナに移行ファイルを作成させる必要がありますか?ボリュームは読み取り専用にする必要がありますか? –

+0

コンテナのコンテキストでmigrationsコマンドを実行することを意味する移行をコンテナに作成させることによって、実際のコマンドとメモで回答を更新することを意味していると思います。あなたの2番目の質問の文脈で、どの音量を意味しますか(名前付きかどうか)? – Adam

関連する問題