0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IntellijIDEAでpython+Docker+poetryの開発環境でライブラリが参照できるようにする

Posted at

TL;DR

poetryの virtualenvs.createをfalse に設定するように変更して、poetryで管理されているライブラリが増えるたびにDockerfileのイメージを作成するようにすれば良い。

想定読書

  • DockerにPythonの実行環境を構築してIntelliJ IDEAで開発をしたい人
  • poetryでライブラリを管理したい人

IntelliJでのDocker上のライブラリが読み込まれる条件

DockerイメージのグローバルなpipライブラリにインストールされているライブラリはIntelliJで読み込まれる。
そのためイメージを作成した後でattachしてpipでインストールされているライブラリを追加しても反映されることがない点に注意。

IntelliJでの環境構築方法

IntelliJでの環境構築方法は公式のドキュメントを参考にしてほしい。

Dockerfileの用意

以下のようなDockerfileを用意する。
重要なのは最後の2行目の poetry config virtualenvs.create false である。
これを設定することでpoetryでinstallしたライブラリがグローバルのpipライブラリにインストールされるようになる。
もしも設定しないとpoetryはvirtualenv環境を実行ユーザのフォルダ(設定によっては実行したフォルダ)に作成するので、IntelliJはそこのライブラリを見に行かないためIntelliJ上で補完などが効かない状態になってしまう。

FROM python:3.12-slim

ENV PYTHONUNBUFFERED=1

RUN apt-get update && apt-get install -y \
    build-essential \
    bash-completion \
    && rm -rf /var/lib/apt/lists/* \

# ホスト環境のリポジトリルートをコンテナの/appにマウントする想定
RUN mkdir /app
WORKDIR /app

RUN pip install poetry \
COPY pyproject.toml ./
COPY poetry.lock ./
# これをやらないとdockerの開発環境のライブラリがIntelliJに反映されない
# デフォルトではvirtualenv環境が/root/*に作成されてしまいIntellijはグローバルのpipの環境を見に行くのでpoetryでinstallしたライブラリ群がないように見えてしまう
RUN poetry config virtualenvs.create false
RUN poetry install --no-root

このDockerfileの記述だとpyproject.tomlやpoetry.lockがある前提だが、当然だがプロジェクトの一番はじめにはこれらのファイルは存在しない。
そのため初回はDockerfileなどを利用せずにpythonのコンテナイメージからpoetryをインストールして、poetry initなどを行ってpyproject.tomlやpoetry.lockを作成する必要がある。

あとはpoetryでライブラリを追加するたびにDockerfileをビルドし直せばIntelliJでライブラリが読み込まれるようになる。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?