Slide 1

Slide 1 text

Poetryでパッケージ管理 on Docker @mizzsugar0425 2019/08/08 Stapy

Slide 2

Slide 2 text

お前誰よ ・みずきと申します。 ・先月、Pythonを始めて1年が経過しました。 ・仕事:DjangoでWeb開発 ・仕事外:Pyramid/Nuxt/TypeScriptを頑張っている ・美味しい水出しコーヒーが飲みたい

Slide 3

Slide 3 text

pip install -r requirements.txt

Slide 4

Slide 4 text

以前はpip installのみで パッケージ管理していました。

Slide 5

Slide 5 text

パッケージ同士の依存関係を 管理できない問題

Slide 6

Slide 6 text

Docker上で Pipenvやpoetryを使いたい

Slide 7

Slide 7 text

Poetryやるぞお! poetryにした理由 ・lockがPipenvより早い ・(個人的な理由だけど)pyproject.tomlとsetup.pyを自動生成してくれ るので今後のPyPIデビューに備えて使いこなしたい

Slide 8

Slide 8 text

ディレクトリ構成 ├── app │ ├── poetry.lock │ ├── project │ │ ├── アプリケーションコード諸々 │ └── pyproject.toml ├── docker │ ├── app │ │ ├── Dockerfile │ │ └── start-server.sh │ ├── etc │ │ └── gunicorn.conf │ ├── db │ └── Dockerfile └── docker-compose.yaml

Slide 9

Slide 9 text

docker-compose.yaml version: "3" services: app: build: context: ./docker/app dockerfile: Dockerfile env_file: .env volumes: - ./app:/home/app - ./docker/app:/home/docker - ./docker/etc/gunicorn.conf:/etc/gunicorn.conf - ./docker/var/log/gunicorn:/var/log/gunicorn working_dir: /home/app entrypoint: "/bin/sh" command: "/home/docker/start-server.sh" ports: - "8080:8080" tty: true depends_on: - db db: build: context: ./docker/db dockerfile: Dockerfile env_file: .env ports: - 5432:5432 volumes: - ./docker/postgres/pgsql-data:/var/lib/postgresql/data PythonコンテナとDBコンテナの 2つでアプリケーションを動かすとい う設定です。

Slide 10

Slide 10 text

pyproject.tomlとpoetry.lockどこにおく? 案1:docker/app以下 案2:app以下 →案1でやってたけど、パッケージインストールしたりアップデー トするたびにdocker/app以下に移動するのが 面倒なので案2の方が楽だな・・・と思った

Slide 11

Slide 11 text

コンテナ立ち上がると同時に色々してほしい! →シェルスクリプトにやってもらおう

Slide 12

Slide 12 text

シェルスクリプトにやってもらう #!/bin/bash cd /home/app poetry install cd project if [ "${DJANGO_ENV}" = 'production' ]; then poetry run python manage.py migrate --settings config.settings poetry run python manage.py collectstatic --noinput poetry run gunicorn config.wsgi:application -c /etc/gunicorn.conf -b :8080 else poetry run python manage.py migrate poetry run python manage.py runserver 0.0.0.0:8000 fi

Slide 13

Slide 13 text

シェルスクリプトにやってもらう #!/bin/bash cd /home/app poetry install cd project if [ "${DJANGO_ENV}" = 'production' ]; then poetry run python manage.py migrate --settings config.settings poetry run python manage.py collectstatic --noinput poetry run gunicorn config.wsgi:application -c /etc/gunicorn.conf -b :8080 else poetry run python manage.py migrate poetry run python manage.py runserver 0.0.0.0:8000 fi poetryでインストールしたパッ ケージをインストールします。 poetry run を頭につけると poetryが作ってくれる仮想環境で 操作がされる動きになります。

Slide 14

Slide 14 text

docker-compose.yamlにコマンド追加 (次のスライドへ)

Slide 15

Slide 15 text

docker-compose.yaml version: "3" services: app: build: context: ./docker/app dockerfile: Dockerfile env_file: .env volumes: - ./app:/home/app - ./docker/app:/home/docker - ./docker/etc/gunicorn.conf:/etc/gunicorn.conf - ./docker/var/log/gunicorn:/var/log/gunicorn working_dir: /home/app entrypoint: "/bin/sh" command: "/home/docker/start-server.sh" ports: - "8080:8080" tty: true depends_on: - db db: build: context: ./docker/db dockerfile: Dockerfile env_file: .env ports: - 5432:5432 volumes: - ./docker/postgres/pgsql-data:/var/lib/postgresql/data

Slide 16

Slide 16 text

Docker環境内での操作 poetryでインストールしたパッケージを使った操作をしたい場 合、 poetryが用意した仮想環境に入る必要がある。

Slide 17

Slide 17 text

docker-compose exec app bash まずPythonコンテナに入って cd project poetry run python manage.py shell poetryが作成してくれる仮想環境にて実行! poetry shell cd project poetry run python manage.py shell こちらでも可

Slide 18

Slide 18 text

パッケージの追加・アップデート poetry add [パッケージ名] まずPythonコンテナに入ってから・・・ 新しくパッケージを追加 poetry update [パッケージ名] パッケージのアップデート

Slide 19

Slide 19 text

リポジトリはこちら https://github.com/mizzsugar/poetry_on_docker

Slide 20

Slide 20 text

ブログもあるよ http://mizzsugar.hatenablog.com/entry/2019/08/ 08/191318

Slide 21

Slide 21 text

おまけ 〜Pipenv編〜 (ぶっちゃけやることはあんま変わらなかった) https://github.com/mizzsugar/pipenv_on_docke r

Slide 22

Slide 22 text

ありがとうございました!