【WSL2, Docker】Pythonの開発環境を構築する【VSCode】

Pythonの開発環境をWSL2とDockerで構築します。

環境
Windows
10 21H2 (19044.2604)
WSL
2
Ubuntu
20.04 LTS
Docker Desktop for Windows
4.9.1 (81317)
VSCode
1.75.1

Dockerイメージの選定

本番環境で使用しているエックスサーバーに合わせて、今回はPython3.6.8を使用します。

ビルドコンテキスト

home/dev/python/
|-- .devcontainer/
|   |-- python/
|   |   `-- Dockerfile
|   |-- .env
|   |-- devcontainer.json
|   `-- docker-compose.yml
`-- src/

.devcontainer/

python/Dockerfile

.devcontainer/python/Dockerfileの内容は以下となります。
sudo、sqlite3、pipでjupyter-labなどを追加していますが、Pythonのバージョン(Dockerイメージ)も含め、必要に応じて書き換えてください。

Dockerfile
FROM python:3.6.8-slim

ARG USER_ID
ARG GROUP_ID
ARG USER_NAME
ARG USER_PASS

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
ENV PATH $PATH:/home/${USER_NAME}/.local/bin

RUN apt-get update && apt-get -y install --no-install-recommends \
    sudo \
	locales \
    git \
    openssh-client \
    ssh-agent-filter \
    sqlite3 && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

RUN /usr/local/bin/python -m pip install --upgrade pip && \
	pip install --upgrade setuptools && \
	pip install jupyterlab pytest pytest-cov

RUN groupadd -g $GROUP_ID $USER_NAME && \
    useradd -u $USER_ID -g $GROUP_ID -G sudo -s /bin/bash -m $USER_NAME && \
    echo $USER_NAME:$USER_PASS | chpasswd && \
    echo "$USER_NAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

USER $USER_ID

.env

Dockerfile,docker-compose.ymlへ渡す定数を定義します。

CONTAINER_NAME=python

PORT_WEB=8088

USER_ID=1000
GROUP_ID=1000
USER_NAME=dev
USER_PASS=pass

docker-compose.yml

version: '3'

services:
  web:
    build: 
      context: ./python
      args:
        USER_ID: ${USER_ID}
        GROUP_ID: ${GROUP_ID}
        USER_NAME: ${USER_NAME}
        USER_PASS: ${USER_PASS}
    image: python3
    container_name: ${CONTAINER_NAME}
    command:
      jupyter-lab --ip=0.0.0.0 --allow-root --NotebookApp.token='' --no-browser
    ports: 
      - ${PORT_WEB}:8888
    volumes:
      - ../src:/home/${USER_NAME}/src
    working_dir: /home/${USER_NAME}/src
    tty: true
    stdin_open: true

devcontainer.json

{
	"name": "Python",
	"dockerComposeFile": "./docker-compose.yml",
	"service": "web",
	"workspaceFolder": "/home/dev",
	"overrideCommand": false,
	"extensions": [
		"ms-ceintl.vscode-language-pack-ja",
		"ms-python.python",
		"ms-python.vscode-pylance",
		"qwtel.sqlite-viewer"
	],
	"settings": {
		"python.analysis.typeCheckingMode": "basic",
	},
	"postCreateCommand": ""
}