PyCharm + Docker Composeで開発する

Posted by rhoboro on 2017-01-29

前回はPyCharmで単体のDockerfileを使う内容の記事でしたが、実際の開発だとDocker Composeを使うことが多いかなと思います。
そこで、今回はDocker Composeを使ってDjangoアプリを動かしてみました。
ちなみにサンプルコードよりも実践的な内容にしたかったので、PyCon JP 2016のWebサイトを動かしていきます。

手順

ざっくりした手順は下記。

  1. Docker環境の準備(前回と同じ)
  2. ソースコード一式をcloneして、PyCharmで開く
  3. PyCharmでInterpreterの設定
  4. Run Configurationの設定
  5. Djangoアプリの初期設定を行い、実行する

Docker環境の準備

まず、前回同様Dockerインストール済みの環境を用意します。 さくっとdocker-machineでやりました。

[alpaca]~/github/pycon % docker-machine start
Starting "default"...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
[alpaca]~/github/pycon % docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/rhoboro/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
export DOCKER_API_VERSION="1.24"
# Run this command to configure your shell:
# eval $(docker-machine env)
[alpaca]~/github/pycon % eval $(docker-machine env)

ソースコード一式をcloneして、PyCharmで開く

まずはソースコードの用意。

[alpaca]~/github/pycon % git clone git@github.com:pyconjp/pyconjp-website.git
[alpaca]~/github/pycon % cd pyconjp-website
[alpaca]~/github/pycon/pyconjp-website % git checkout 2016

いろいろ設定する前にdocker-compose.yamlの中身を見ておきましょう。

version: '2'
services:
  db:
    image: postgres:8.4.22
    environment:
      POSTGRES_DB: pyconjp2016
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: pass
    ports:
      - "5432:5432"
    #volumes:
    #  - ./vol/db:/var/lib/postgresql/data
  web:
    build: .
    image: pyconjp/website:2016
    depends_on:
      - db
    ports:
      - "8000:8000"
    links:
      - db:postgres
    environment:
      DEBUG: 1
      ENVIRONMENT: dev
      DB_ENGINE: postgresql_psycopg2
      DB_NAME: pyconjp2016
      DB_USER: postgres
      DB_PASSWORD: pass
      DB_HOST: postgres
      DB_PORT: 5432
      LOG_PATH: ./pyconjp_website.log
      ERROR_LOG_PATH: ./pyconjp_website.error.log
      SECRET_KEY: "<secret>"
      LANG: ja_JP.UTF-8
    volumes:

DBコンテナdbとWebアプリコンテナwebの2つを使うシンプルな構成ですね。
また、各種設定情報は全部環境変数で受け渡しを行なっています。 もっと中身を知りたい方は、Dockerfileとエントリポイントになっている/app/scripts/run-docker-website.shを見るといいと思います。 (この辺りは2016で清水川さん(@shimizukawa)が整備してくれました)

続いて、このディレクトリをPyCharmで開きますが、Interpreterはあとで設定するのでデフォルトのままにしておきます。

open

PyCharmでInterpreterの設定

タイトルは前回と同じですが、今回はDocker Composeを使います。
Preferences > Project Interpreterで、歯車マーク内のAdd Remoteを選択して、Docker Composeを指定します。

  • Server
    • 前回のものでOK。
    • もしなければこのセクションの最後に貼ったキャプチャを参照してNewから作ってください。
  • Configuration file(s)
    • プロジェクトディレクトリからdocker-compose.yamlを追加します
  • Service
    • docker-compose.yamlに記載された内容が表示されます。
    • ここに対してmanage.pyが動きます。
    • したがってDjangoアプリケーションが動くコンテナを選択します。
    • 依存関係上、デフォルトだとdbになっているので要注意。(ここで数時間を失いました。。。)

最終的に下記のような設定になっていればOK。

interpreter-1

ここまでくるとrequirements.txtから依存関係を解決してくれるのでこのままOKを押して少し待ちます。

interpreter-2

(Serverがない場合は、下記を参照してください。IPなどは人によるかも。)

docker

Run Configurationの設定

基本的な設定はされていますが、Hostに0.0.0.0を設定しておきましょう。
自動でブラウザを起動させたい時は、Run BrowserにDockerホストのIPアドレスを設定します。

run_configuration

実行

ここまでできたら、一度実行してみます。
初回はpullが走りますねー。

pull_postgresql

終わったらブラウザが起動するのでしばらく待ちます。。。。
。。。。。。
。。。
(エラーは出てますが)Djangoは動いたようですね!w

error-1

とりあえずDjangoが動くことは確認できたので、ここからはPyCon JP 2016サイトを動かすための設定をしていきます。

まずは、ユーザーを作りましょう。

とりあえず、Tools > Run Manage.py Task... でcreatesuperuserを行ってみましたが、下記のエラーに。。。

run_managepy_task

調べてみたら、PY-21680 Execution of manage.py commands fails under docker compose interpreterというチケットが起票されてました。orz

ということで、気を取り直してTerminalからやっていきます。
せっかくなのでかっこよくCmd + Shift + Aを押して「Terminal」と入力してPyCharm上で起動しましょう。
dockerはdocker-compose run コンテナ名 コマンドで任意のコンテナでコマンドを実行できます。

[alpaca]~/github/pycon/pyconjp-website % eval $(docker-machine env)
[alpaca]~/github/pycon/pyconjp-website % docker-compose run web python manage.py syncdb

~省略~

// ユーザーを作るか聞かれるのでyesと答えて作っていきます
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'): root
Email address: [email protected]
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

~省略~

 - pycon.tutorials
 - pyconjp
(use ./manage.py migrate to migrate these)
// DBのマイグレーション
[alpaca]~/github/pycon/pyconjp-website % docker-compose run web python manage.py migrate

ここまできたら再度Runしてみましょう。

またもエラーに。。。orz

error-2

でもさっきよりも親切になりましたw

error-3

なにやらスポンサー周りのコードでえらーになってるようですね。
コード読んでないですが、おそらくall_sponsorsがないとかだと思います。

ということで、なければ作ればいいじゃない。
URLの末尾にadminを足してアクセスすると管理画面が起動していると思います。
ここで先ほど作ったユーザーのメールアドレス/パスワードを入力してログインしましょう。

いろんな項目がありますが、いまはとりあえずスポンサーを追加していきます。
下記の「スポンサー」の追加ボタンを押すと、スポンサー一覧画面が表示されるので右側にある「スポンサーを追加」を押します。

admin-1

するとこんな画面になるので適当に入力します。

admin-2

名前だけ入れて保存しようとしたらめっちゃ怒られましたwww

admin-3

素直に項目を埋めていきましょう。無い項目は「+」を押すと、ウィンドウが開いて追加できます。

admin-4

全部埋めててくとこんな感じで追加できました。

admin-5

さぁ、気を取り直して再度http://192.168.99.100:8000/2016/ja/にアクセスしてみます。

toppage

今度こそ動きましたー!ぱちぱち。

最後に

サービスとして実際に動いているWebサイトのコードで試し、動かすところまでできたので良かったです。(1つ目に公式のQuickstart: Compose and Djangoをやってた)
2016のサイトで実行しましたが、2017Webサイトもベースは同じなので、この記事を見て、コントリビュートしてくれる人がいたら大歓迎ですw
まだスタッフも募集してますよー。 → PyCon JP 2017 スタッフ申し込み

一部Terminalからコマンド直叩きをせざるを得ない部分がありますが、現時点のPyCharm 2016.3.2ならDocker Composeを使った開発も可能ですね。 便利機能以前にまだまだ動かない部分(未実装なのかバグなのか)も多々ありますが、確実に改善されてきているのでJetBrainsさんには期待してます。