見出し画像

【VSCode】Devcontainerを使ってpythonの開発をしてみる

Dockerから逃げるな。


Devcontainerとは

VScode上で簡単にDockerコンテナを起動してその中で開発できるようにする様な感じのあれ(わやわや)

……というわけで、わやわやしています。わやわやしていて居るので、使い方をお勉強しながら忘れない様にまとめていきます……

Dockerとは

パソコン上に簡単(※簡単とは言ってない)に仮想マシン(=コンテナ)を構築して、その環境をあっちでもこっちでも簡単に再現できるようにした仕組みのこと、で、いい、はず(わやわや)とりあえず、今私はそのために使いたい。

とりあえず、ずっとわやわやしていた点についてはここがとてもわかりやすかったので、ここを読む

Dockerをインストールする

Docker インストール 検索
(自分のPCには大昔にインストールしてあったもんで……)

WSLを有効化する

過去にまとめたのでこちらを。

Dockerfileを作る

人から貰ったDockerFileで楽をしようと思ったらなんか上手く行かなかったので基礎からちゃんと……やります……

Dockerfileとは

今からこれこれこういうコンテナを作っておくれ、という命令書のこと。コンテナを作る時に、こういう設定でー、こういうアプリケーションインストールしてー、って最初にやる作業コマンドを全部書き並べて作ります。たぶん。(わやわや)

とはいえゼロから作るのは大変なので、ベースイメージを探します。
色々なところが「これテンプレートにすると便利じゃよ」というものを公開してくれているので、それを探して、それをベースにして作ると良いです。

# Dockerfile

FROM python:3.10.12-slim-buster
LABEL com.example.vendor="yucco"

とりあえずこれ2行書けば、pythonだけインストールされた最低限のLinuxイメージが作られます。二行目はとりあえず「わたしがつくりました」の表記だけ入れてあります(わやわや)。com.exampleの所は適宜サービスのドメインに置き換えたりするといいと思います。
あとは……随時足していきましょう…

pythonのバージョンは必要に応じて最新にしたり、自分の環境に合わせたりしてください。最初合わせないで適当にサンプルのまま作ったらpythonのバージョン違って泣きを見た。

ちなみに、手動でDockerfileを作らずに、自動で作って貰う方法もあります。ゼロから開発環境作るならそっちの方が手っ取り早いかも。

こちらの記事が詳しかったです。

Dockerfileをもとに、開発用Dockerイメージを作成する

Dockerfileが書けたら、Dockerイメージを作ります。

「命令書をもとに、設計図を作ります」…って理解でいい…はず…

最終目標は、仮想マシンである「コンテナ」を動かすことにあります。が、コンテナを毎回一から作って、そのたびに起動してたらすっごく時間が掛かる。でも、コンテナをずっと動かし続けているとPCへの負担がすっごい。
ということで、いったん途中(=イメージ)まで作って(=ビルドして)おいて、あとは必要な時に起動するようにする…という、ことで、いいと、思う(わやわや…)

 $ docker build -f Dockerfile -t test_image .

これで、「Dockerfileを使って、test_imageという名前のイメージを作ってちょ」という命令になります。最後のピリオドは大事なので抜かないように。
(ピリオドが抜けると、「"docker buildx guild" requires exactly 1 argument.」というエラーが出でビルドできない)

一度作ったイメージを元に別のイメージを作る

毎回毎回コンテナイメージをイチから作るのも大変なので、「自分が良く作る感じのやつ」「チームで良く使う感じの奴」を作っておいて、それを元にさらに必要なものを追加して今回用のコンテナ作ると便利。
でも、似たようなDockerfileを複数作るのはメンテナンスが大変。

なので、ベース用に作ったDockeイメージを元にして、足りない部分だけ追記して本番用Dockerイメージを作っちゃえ。

# Docekrfile_dev

FROM python:3.8.12-slim-buster
LABEL com.example.vendor="yucco"
# その他色々な設定…………

まず、ベースにする用のDockerfile_devを作成。「Dockerfile」の名前は本番用に使いたいので別の名前にしておきます。

$ docker build -f Dockerfile_dev -t dev_image .

Dockerfile_devを使ってdev_imageという名前のイメージをビルドします。このイメージを元にして、本番用のDockerfileを作ります。

# Dockerfile
FROM dev_image

# モジュールのインストール
RUN python3 -m pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

# ソースコードをコピーする
COPY . /application
WORKDIR /application/src

# プログラム実行
CMD ["python3", "main.py"]

この一行目の「FROM」が、先ほど作ってローカルに存在しているdev_imageを取りに行ってくれて、それを元に新しいイメージを作ってくれます。
先ほどはwebに公開されている公式イメージを取りに行きましたが、まずローカルを探すという仕様になっているようなので、同じ名前のイメージでも、ローカルに先に作ってあればそちらを優先して取得するようです……が、ややこしいので自作イメージをベースに新しいイメージを作る予定があるときは、ベースにするイメージも一意の名前にしておくのが良いでしょう。

開発用コンテナをVScode上で起動するための拡張をインストールする

VScodeのEXTENTIONS画面で「Dev Containers」を検索してインストール。マイクロソフトが出してるやつ。

VScode上で開発用コンテナを起動する

ココまで出来たら、画面左下隅にある青い「><」アイコンをクリックして、「コンテナで開く(reopen in container)」を選択すると、自動で開発用イメージが新しく作られて、コンテナが起動する。(上記で作ったイメージを元にしてさらに別のイメージが作られるっぽい)
最初に起動する時に使うDockerfileを選べる気がする(わやわや…)

ちなみに、Dockerfileを用意しないでVScodeに作って貰う方法もあり。

思ったDokerfileで起動してくれなかったら、生成された.devcontainerフォルダの中にあるdevcontainer.json内のbuild項目内の「dockerfile」のパスを変更する。

VScode上で開発をする

コンテナが起動出来たら、後はいつも通り開発するだけです。

VScodeのExtentions(拡張機能)について

仮想コンテナ上には指定しない限り拡張機能がインストールされません。各言語向けのコードヒント機能とかも機能しなくなってしまうので、改めてインストールする必要があります。
毎回手動インストールするのは面倒なので、devcontainer.jsonに記述しておけば自動でインストールしてくれます。
これも手動で記入するのは面倒なので、拡張機能のインストール画面を開き、インストールボタンと同じ行にある歯車マークを開くと、「devcontainer.jsonに追記する」的なメニューがあるのでそれを使用するとらくちんです。

pythonの追加モジュールの取り扱い

開発コンテナ内には一々venvを作らなくて大丈夫で、pipでインストールしたモジュールはイメージを破棄するまでちゃんと覚えててくれるようです。
(ところでこのコンテナ内でインストールしたモジュールはどこにインストールされてどこに記憶されているんだろうか……コンテナイメージ内という理解であってる……?)
但し、requirements.txtにちゃんと追記しておかないと、リビルドしたときとか下記の本番リリースの時に抜けるので、そこの所は抜かりなく。

gitとの連携

コンテナ内で変更したファイルはちゃんとローカルでも変更され、gitへも反映されるので、コンテナ内で開発しているということはあまり意識せずに作業が可能です。
(意識しなすぎて、コンテナ内がLinux環境であることを忘れそうになるのでそこは注意が必要)

開発用コンテナを作り直す

pythonのバージョンアップしたいとかで開発用コンテナを作り直す場合

  1. 開発用Dockerfileを必要な内容に書き直す

  2. 以下のコマンドで開発用コンテナを止めて、イメージを削除してからもう一度ビルドする

2をやらないと、開発用コンテナを作り直したつもりで、VScodeが作ってくれた方のコンテナが作り変わらないので注意。

$ docker container ls -a

で一覧を表示して、「開発用に作ったイメージの名前の先頭に「vsc-」、末尾に乱数が付与されている名前」を使っているコンテナ名(一番左に表示されているランダム文字列)を探す。

$ docker container stop XXXXXXX

(XXXXXXXはコンテナ名に置き換える)で、該当のコンテナを止める

$ docker container rm XXXXXXX

コンテナを消す

$ docker image rm vsc-dev_imageXXXXXXXXXXX

(vsc-dev_imageXXXXXXXXXXXは消したいイメージ名に置換)イメージも消します。

これでもう一度開発用コンテナを作れば大丈夫、の、はず。

OK?これでOK??これで開発用コンテナで開発して公開できる??

この記事が気に入ったらサポートをしてみませんか?