はじめに
私は今までの個人開発も、業務中の開発も、使用している外部ライブラリのインポート警告表示(Pylance)を、動くなら良いかと放置していました。

しかし、解消できるものなら解消したい。ChatGPTに聞いたところ、DevContainersを導入すればできるとのことだったので、導入しました。

違うコードで恐縮ですが、解消できたので、方法をまとめます。
前提
本記事の作業を始める前に、以下の準備ができています。
- Docker Composeでの開発環境構築済みで起動中
- VSCodeの拡張機能でDevContainersインストール済み
上記については解説しません。こちらが完了している人向けの記事になります。
必要な作業
本記事では以下の作業を扱います。
- DevContainersの起動
- PythonのインタープリタをDockerコンテナ内部のものにする
- DevContainersにPythonの拡張機能をインストール
DevContainers起動の準備
左下の「><」をクリック
「><」をクリックするとメニューが開くので、Reopen in Containerを選択します。
今から行うDevContainersの設定を行うと、今後はこの「Reopen in Container」をクリックすることで、DevContainersが起動します。
設定ファイルの作成場所を聞かれる
「Where would you like to create your container configuration?」と聞かれるので、現在のワークスペースに作るのか、別の場所に作るのかを選択します。
私は現在のワークスペースに作りたかったので、「Add configuration to workspace」を選択しました。説明は、「This allows you to share the configuration with others via source control」とのこと。
これを選ぶと、現在開いているワークスペースに「.devcontainer」というディレクトリと、その中に「devcontainer.json」、「docker-compose.yml」ファイルが作成されます。この中で設定していきます。
compose.yamlから設定する
次に、開いているワークスペースの直下に「compose.yaml」(おそらくdocker-compose.ymlでも大丈夫かと予想)ファイルがあると、「Where would you like to create your container configuration?」がそのままに、選択肢が出てきます。本記事ではすでにあるcompose.yamlを使用するので、「From 'compose.yaml'」を選択します。
このcompose.yamlが他のディレクトリに入っていたりすると、この選択肢が出ず、「Select a container configuration template or enter a custom tamplate id」という問いになり、テンプレートから選ぶことになります。
私は昔compose.yamlを含めてdockerディレクトリを作ってそこにDocker関連のファイルをまとめる、というやり方をしていたので、それだとこのDevContainersはスムーズに設定できないことが発覚。compose.yamlは今後プロジェクトのディレクトリ直下に配置することにきめました。
サービスの選択
次の質問は「Select a service」ということで、自分で作ったcompose.yamlファイルにあるサービス名が選択肢になっています。Pythonの開発にDevContainersを使うので、Pythonを動かすサービス名を選択します。
追加のインストールは無視
次は「Select additional features to install」と出ますが、すでに設定されているものを使用するので、何も選択せず「OK」をクリック。
さらに「include the following optional files/directories」と出ますが、これも何も選択せず「OK」で。
.devcontainerが作成される
上記まで進むと、自動的に.devcontainerディレクトリがワークスペースに追加されます。
devcontainer.jsonの編集
.devcontainerディレクトリの中に「devcontainer.json」が作成されるので、このファイルを編集します。
編集すべきは、"workspaceFolder"です。これは、コンテナ内で使用するフォルダー(ディレクトリ)を指定します。私の場合は、pythonのコンテナ内ではappというディレクトリをワークディレクトリ(WORKDIR)にしていたので、"/app"と指定しました。
DevContainersの起動
再び「Reopen in Container」をクリックしてDevContainerを起動する
最初に.devcontainerディレクトリを作った時と同様、画面左下の「><」をクリックし、「Reopen in Container」をクリックします。
今度はすでに.devcontainerディレクトリやファイルができているので、ようやくDevContainersが起動します。
ちなみにcompose.yamlファイルに不備がありそもそもDocker Composeにエラーが起こるとDevContainersも正常に動作しませんので、先にdocker compose up -d等でコンテナが立ち上がるかの確認をした方が良いかと思います。
私はいろいろcompose.yamlを変更した後にDevContainersを起動し、見事にエラーとなりました。
インポートエラー表示の解消
PythonのインタープリタをDockerコンテナ内部のものにする
以前記事でも書いた通り、VSCodeは自動的にインタープリタを設定します。
ということで、DevContainers起動後も、インタープリタをチェック。右下に「3.12.12」というようにPythonのインタープリタをDockerコンテナ内のものにします。
私の場合は「/usr/local/bin/python」でした。これは各々の設定で異なるかと思いますので、ご確認ください。
DevContainersにPythonの拡張機能をインストール
これで、当初の悩みであるインポートエラー表示は消失しました。しかし、コードの色分け(シンタックスの強調)ができておらず、from flask import Flaskの「flask」「Flask」が白いまま。
これは、VSCodeの拡張機能をDevContainersにインストールする必要があります。拡張機能にて「python」で検索すると、それぞれの拡張機能に「Install in Dev Container: DevContainersの名前」と表示されます。
個別の名前が表示されているとおり、DevContainersのプロジェクトそれぞれで使用する拡張機能を設定する必要があるようです。ちなみにdevcontainer.jsonでも設定できるみたいです。各々の設定が面倒な場合は、共通の拡張機能をあらかじめ設定することもできるそうです(下記記事参照)。
まとめ
「動けばいい」から、「警告が出ない」までこだわるために必要な作業をまとめました。
とりあえず警告は消えましたが、いかんせん.gitが今回のワークディレクトリになかったりする関係で、DevContainersで開いた場合、Gitの色分け(変更済み、新規作成ファイルなど)の区別がつかないのが非常に面倒な感じになってしまいました。こちらも解消した構成を考えなければいけないかもしれません。