Open11

Docker+Poetry+GitでPython開発環境を構築する

環境

  • Windows 10 WSL 2 Ubuntu 20.04 + Docker 20.10.5

なにするか

  • Jupyter でPython実行する
  • Flask できる
  • VSCodeで開発できる

Docker で環境つくる

# ディレクトリを作成する
$ mkdir python-dev && cd $_

# git を初期化
$ git init .
$ wget https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore --output-document=.gitignore
.-
├ Dockerfile
├ docker-compose.yml
└ app/
Dockerfile
FROM python:3.9.4-slim
USER root

WORKDIR /app

RUN apt update; apt -y upgrade
RUN apt install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN pip install poetry
docker-compose.yml
version: '3.4'
services:
  web:
    build: .
    volumes:
      - .:/app
    environment:
      - FLASK_APP=index.py
    ports:
      - 127.0.0.1:5000:5000
    command: "poetry run flask run --host=0.0.0.0"
  note:
    build: .
    volumes:
      - .:/app
    ports:
      - 127.0.0.1:8888:8888
    command: "poetry run jupyter lab --no-browser --ip=0.0.0.0 --port=8888 --allow-root --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.disable_check_xsrf=True"
$ docker-compose run --rm web poetry init --no-interaction
$ docker-compose run --rm web poetry add jupyterlab flask  
$ docker-compose run --rm web poetry git+https://github.com/python-kasa/python-kasa.git#master

poetry をインストール

Linuxbrewをインストール済みなので、brew でインストールする。

$ brew install poetry

PATHを通す

test -r ~/.bashrc && echo "export PATH=${HOME}/.poetry/bin:${PATH}"  >>~/.bashrc

プロジェクトの作成

# ディレクトリを作成する
$ mkdir python-dev && cd $_

Poetry の初期設定

対話式で設定。

$ poetry init

代わりに、poetry init --no-interaction 対話をスキップも可能。
pyproject.tomlファイルが作成される。

パッケージの追加

addでパッケージを追加する。

$ poetry add jupyterlab flask

# githubを直接参照する時。cloneしてbuildしてinstallしてくれる
poetry add git+https://github.com/xxxxxx/xxxxxx.git

pyproject.toml
[tool.poetry.dependencies]
python = "^3.9"
jupyterlab = "^3.0.14"
Flask = "^1.1.2"
python-xxxxx = {git = "https://github.com/xxxxxx/xxxxxx.git"}

Gitを初期化

gitignore.ioを使って.gitignoreファイルを作成する。
Gitリポジトリを初期化して、commitしておく。

$ curl -L .gitignore https://www.gitignore.io/api/python,virtualenv

$ git init
$ git add .
$ git commit -m "initial commit"

仮想環境へ入る

$ poetry shell

(.venv)$ exit

Docker化する

.dockerignore を作成する

.dockerignore
.venv/
__pycache__/

Dockerfileを作成する

Dockerfile
FROM python:3.9.4-slim
WORKDIR /app

RUN apt-get update && apt-get install -y git
RUN pip install --upgrade pip && pip install poetry
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false --local
RUN poetry install
docker-compose.yml
version: '3.4'
services:
  web:
    build: .
    volumes:
      - .:/app
    environment:
      - FLASK_APP=index.py
    ports:
      - 127.0.0.1:5000:5000
    command: "poetry run flask run --host=0.0.0.0"
  note:
    build: .
    volumes:
      - .:/app
    ports:
      - 127.0.0.1:8888:8888
    command: "poetry run jupyter lab --no-browser --ip=0.0.0.0 --port=8888 --allow-root --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.disable_check_xsrf=True"
index.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
$ docker-compose build
$ docker-compose up
$ docker-compose restart
Dockerfile
FROM python:3.9.4-slim as builder
WORKDIR /app

RUN apt-get update && apt-get install -y git
RUN pip install --upgrade pip && pip install poetry
COPY pyproject.toml poetry.lock ./
RUN poetry export  --without-hashes -f requirements.txt > requirements.txt


FROM python:3.9.4-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY --from=builder /app/requirements.txt .
RUN pip install -r requirements.txt
COPY . .

Poetry add する

$ poetry add pandas
$ poetry update

$ docker-compose ps -a
$ docker-compose stop
$ docker-compose build
$ docker-compose up

作成者以外のコメントは許可されていません