LoginSignup
2
4

More than 1 year has passed since last update.

【メモ】Python/Poetry+Jupyter+VScode+Docker+SSHで開発環境を構築

Last updated at Posted at 2022-01-30

はじめに

この記事では、プログラミング初心者が初めてDocker環境を構築したときの記録を残したものになります。

Dockerをできるようになるには、自分で1から作るのが一番勉強になると思うので、他の方の記事やgithubを参考にしながら、Docker環境を作りました。

具体的には、SSHで共用のワークステーションに接続し、その先でVSCodeを開き、Dockerで作業ができる環境構築を紹介します。言語は、python使用を想定します。juliaとか他言語でも同様にできると思います。

環境

MacBookPro M1

注意

  • 間違いなどありましたら、執筆者の責任です。もしありましたら、指摘していただけると幸いです。

  • DockerやPoetryそのものの説明は省きますので、他の記事を参考にしていただければと思います。

設定の仕方

以下のstep1からstep5で構成される。

Step1. Poetryでプロジェクトを作成

こちらの記事を参考にして、Poetryでプロジェクトを新しく作る。

poetry new <project-name>
$ tree .
.
├── README.rst
├── pyproject.toml
├── qiita_project
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_qiita_project.py

2 directories, 5 files

上記の典型的なディレクトリを自動で作ってくれる。

このプロジェクト専用の仮想環境を立ち上げる。

poetry install

現在のプロジェクトがインストールされた(パソコンがこのプロジェクトを認識したという理解です。)。デフォルトでpytestなどが入っている。pytestを試しに実行してみる。実行する場合は、

poetry run pytest

新しいパッケージを入れる場合は、

poetry add hogehoge

試しに、jupyterlabを入れてみましょう。

poetry add jupyterlab

パッケージを消したい場合は、

poetry remove hogehoge

Step2. Docker環境を作る。

Dockerfileとdocker-compose.ymlを以下のように作成します。

  • DockerfileはDocker imageを作る元です。作成されたimageはローカルの何処かに保存されます。(Dockerfileがpythonでいうクラスみたいな感じ)

  • docker-compose.ymlには、コンテナを立ち上げる命令が書かれています。ここでは、コンテナの中で、jupyterlab or shell を使える環境を整えるための命令が書かれています。

さて、READMEなどがあるのと同じ階層にDockerfileを追加してください。

Dockerfileには以下を記入

FROM python:3.9-slim

ENV PYTHONUNBUFFERED=1

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
    build-essential \
    curl \
    ca-certificates \
    git \
    zip \
    vim \
    && \
    apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* # clean up

WORKDIR /app

COPY pyproject.toml ./

RUN pip install poetry

RUN poetry config virtualenvs.create false \
    && poetry install

docker-compose.yml もDockerfileと同じ階層に以下を記入

version: '3'
services:
  lab:
    build: ./
    container_name: qiita_project_lab
    user: root
    volumes:
      - ./:/app
    working_dir: /workspaces/qiita_project
    ports:
      - "8882:8882"
    command: jupyter lab --ip=0.0.0.0 --allow-root --NotebookApp.token='' --port=8882

  shell:
    build: ./
    container_name: qiita_project_shell
    volumes:
      - ./:/workspaces/qiita_project
    working_dir: /workspaces/qiita_project
    command: /bin/bash


まずDockerfileからDocker imageを作るためにビルドします。

docker compose build

作成したimageからコンテナを構築し、コンテナの中に入ってみます。

docker compose up run shell

このときに何かインストールしたいパッケージを環境に加えることができます。例えば、numpyをインストールしたいときは、続けてコンテナの中で

poetry add numpy

コンテナから出るときは、

exit

Step3. VSCode上でDockerを使う

Dockerfileがあるディレクトリでdevcontainerというディレクトリを作成し、その下に、devecontainer.jsonというファイルを作り、以下を記述します。

{
    "name": "Existing Dockerfile",
    // Sets the run context to one level up instead of the .devcontainer folder.
    "context": "..",
    // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
    "dockerFile": "../Dockerfile",
    // The optional 'runArgs' property can be used to specify additional runtime arguments.
    "runArgs": [],
    // Use 'settings' to set *default* container specific settings.json values on container create.
    // You can edit these settings after create using File > Preferences > Settings > Remote.
    // Uncomment the next line if you want to publish any ports.
    // "appPort": [],
    // Uncomment the next line to run commands after the container is created - for example installing git.
    // "postCreateCommand": "apt-get update && apt-get install -y git",
    // Add the IDs of extensions you want installed when the container is created in the array below.
    "extensions": [
        "ms-azuretools.vscode-docker",
        "julialang.language-julia",
        "colinfang.markdown-julia",
        "mutantdino.resourcemonitor",
        "shardulm94.trailing-spaces",
        "cliffordfajardo.hightlight-selections-vscode",
        "wdawson.better-kill-ring",
        "oderwat.indent-rainbow",
        "github.vscode-pull-request-github",
        "mhutchie.git-graph",
        "donjayamanne.githistory",
        "eamodio.gitlens",
        "bungcip.better-toml",
        "usernamehw.errorlens",
        "ms-vscode.live-server",
        "christian-kohler.path-intellisense",
        "ms-python.python",
    ]
}

作成は、こちらを参考にしました。

続けて、VSCodeのExtenstionsのRemote Containerをインストールし、VSCodeを開いてください。すると、コンテナを開きますかと聞かれるのでYESと答えてください。

すると、コンテナの中に入った状態でVSCodeが使える状態になっていると思います。
この中で作成されたファイルなどはコンテナから出ても消えない(ローカルのプロジェクトがあるディレクトリとコンテナが通信してローカルのディレクトリに保存されている)ので安心して開発を進めることができます。

Step4. Github

ここまでで作成したローカルディレクトリをGithubに登録して、リモートレポジトリーとしてクラウド上にも上げておきます。Githubに上げておくと、過去の履歴が辿れるので便利です。例えば、間違って重要なファイルを消してしまった場合でも、過去の履歴を辿ってファイルを元通りにすることが可能になります。

(Githubを使ったことがない人は、ssh鍵を作成するところからスタートしてください。参考:お前らのSSH Keysの作り方は間違っている)

鍵を作成したら、メールアドレスとユーザー名を登録します。

git config --global user.name <username>

git config --global user.email <emailaddress>

先ほど作ったレポジトリーと同じ階層のところで、

git init

git add/commitをします。

git add file
git commit -m "ここは適当な名前"

次に、githubでレポジトリを作成します。このレポジトリーの名前とURLを用いて、

git remote add <RemoteRipositoryName> <RemoteRipositoryURL>

(<>いらないです)

git push --set-upstream <RemoteRipositoryName> master

これでgithubにリモートレポジトリを作成できました。これで最低限の開発環境は整ったことになるかとと思います。

Step5. SSHでワークステーションの中でDockerを開発をする

最後に、研究室などで、共用のワークステーションの中で作業や開発を進める人も多いでしょう。Dockerを使わない通常のSSH接続はできると仮定して話を進めます。

SSH先のワークステーションで先ほど作ったレポジトリをクローンしてきます。

VSCodeを使って、SSHでワークステーション先でクローンしてきたレポジトリを開くと、コンテナの中で開きますかと聞かれるのでYESと答えます。

コンテナが開けない場合

共用のワークステーションを使っている場合、既に誰かが/tmp/.vsch-#########.を使っているからかもしれません。その場合はWSの.bashrcに

mkdir -p /tmp/$USER
export TMPDIR=/tmp/$USER

を記入すれば一時的なディレクトリを作られて問題が回避できるみたいです。

詳細はこちらを参考:
https://github.com/microsoft/vscode-remote-release/issues/2347

まとめ

Dockerを使った開発環境を整えました。みなさんの快適な環境づくりにお役に立てれば幸いです。

参考にしたもの

  • Poetry関連

  • Docker関連

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4