kakeruuuun
@kakeruuuun

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

dockerコンテナ作成時のpoetry installについて

前置き

Docker初学者なため、的はずれなことを書いている可能性があります

解決したいこと

GtiHub CodespacesでPoetry開発環境を自動でセットアップされるように作成したい

発生している問題・エラー

Dockerfile内でpoetry installを実行しているにも関わらず、
コンテナビルド後poetry run 〇〇を実行できない(Command not foundになる)
poetry installを手動で実行したら使用可能になるが、自動で環境がセットアップされるようにしたい

root@codespaces:/workspaces/tutorial# poetry run isort --version
Creating virtualenv tutorial-31QiwWn4-py3.11 in /root/.cache/pypoetry/virtualenvs
Command not found: isort

構成

使用した環境

  • GitHub Codespaces
  • python3.11

ディレクトリ

ディレクトリ構成
/workspaces/tutorial
|--.devcontainer
|  |--devcontainer.json
|--.gitignore
|--Dockerfile
|--poetry.lock
|--pyproject.toml
|--src
|  |--app.py
Dockerfile
FROM python:3.11

RUN pip install poetry

# install python package
COPY ./pyproject.toml* ./poetry.lock* ./
RUN poetry install
pyproject.toml
[tool.poetry]
name = "tutorial"
version = "0.1.0"
description = ""
authors = [""]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"
black = "^23.12.1"
isort = "^5.13.2"
fastapi = "^0.109.0"
alembic = "^1.13.1"
SQLAlchemy = "^2.0.25"
pyproject-flake8 = "^6.1.0"
uvicorn = "^0.26.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

ビルドログ

creation log
#8 [dev_container_auto_added_stage_label 3/4] COPY ./pyproject.toml* ./poetry.lock* ./
2024-01-22 01:20:56.610Z: #8 DONE 0.2s
2024-01-22 01:20:56.774Z: 
#9 [dev_container_auto_added_stage_label 4/4] RUN poetry install
2024-01-22 01:20:57.321Z: #9 0.698 Creating virtualenv tutorial-il7asoJj-py3.11 in /root/.cache/pypoetry/virtualenvs2024-01-22 01:20:57.328Z: 
2024-01-22 01:20:57.819Z: #9 1.196 Installing dependencies from lock file2024-01-22 01:20:57.833Z: 
2024-01-22 01:20:57.929Z: #9 1.307 2024-01-22 01:20:57.932Z: 
2024-01-22 01:20:58.093Z: #9 1.307 Package operations: 28 installs, 0 updates, 0 removals
2024-01-22 01:20:58.100Z: #9 1.307 
#9 1.308   • Installing idna (3.6)
#9 1.314   • Installing sniffio (1.3.0)
#9 1.315   • Installing typing-extensions (4.9.0)
2024-01-22 01:20:58.326Z: #9 1.704   • Installing annotated-types (0.6.0)
2024-01-22 01:20:58.441Z: #9 1.706   • Installing anyio (4.2.0)
2024-01-22 01:20:58.447Z: #9 1.706   • Installing markupsafe (2.1.3)2024-01-22 01:20:58.465Z: 
#9 1.715   • Installing greenlet (3.0.3)
#9 1.717   • Installing mccabe (0.7.0)
#9 1.719   • Installing pycodestyle (2.11.1)
#9 1.760   • Installing pydantic-core (2.14.6)
#9 1.819   • Installing pyflakes (3.1.0)
2024-01-22 01:20:58.682Z: #9 2.061   • Installing click (8.1.7)
2024-01-22 01:20:58.789Z: #9 2.063   • Installing flake8 (6.1.0)
2024-01-22 01:20:58.791Z: #9 2.065   • Installing mako (1.3.0)
#9 2.065   • Installing mypy-extensions (1.0.0)
#9 2.066   • Installing h11 (0.14.0)
#9 2.078   • Installing packaging (23.2)
#9 2.129   • Installing pathspec (0.12.1)
#9 2.168   • Installing platformdirs (4.1.0)
2024-01-22 01:20:58.989Z: #9 2.213   • Installing pydantic (2.5.3)
#9 2.214   • Installing sqlalchemy (2.0.25)
#9 2.217   • Installing starlette (0.35.1)
2024-01-22 01:20:59.130Z: #9 2.508   • Installing alembic (1.13.1)
2024-01-22 01:20:59.289Z: #9 2.511   • Installing black (23.12.1)
#9 2.511   • Installing fastapi (0.109.0)
#9 2.511   • Installing pyproject-flake8 (6.1.0)
#9 2.514   • Installing isort (5.13.2)
#9 2.516   • Installing uvicorn (0.26.0)2024-01-22 01:20:59.295Z: 
2024-01-22 01:20:59.396Z: #9 2.775 
2024-01-22 01:20:59.548Z: #9 2.775 Installing the current project: tutorial (0.1.0)
#9 2.776 
2024-01-22 01:20:59.551Z: #9 2.776 The current project could not be installed: [Errno 2] No such file or directory: '/README.md'
#9 2.776 If you do not want to install the current project use --no-root
2024-01-22 01:20:59.965Z: #9 DONE 3.3s

poetry installは正常に実行できている様に見える。
が、作成されているはずのvirtualenvはビルド後に存在しない
poetry env listを実行しても表示されない)

自分で試したこと

poetryに仮想環境を作らせないように設定するとうまく行った

Dockerfile
# install python package
COPY ./pyproject.toml* ./poetry.lock* ./

# Poetryが仮想環境を生成しないようにする
RUN poetry config virtualenvs.create false
RUN poetry install

Docker上であればこの設定で基本は問題ない?
とは思われるのだが、なぜ仮想環境を作成した場合にうまく行かないのかを知りたい。

0

1Answer

poetryに仮想環境を作らせないように設定するとうまく行った

憶測ですみません。多分、コンテナ外(ホスト側)の仮想化のエンジンを間借りできないからと推測します。

docker in docker で調べ、コンテナを起動する際、docker run –privileged 。。。 を付けて起動してみて下さい。ハイフンが1個?2個?

コンテナ内部でもpoetryがコンテナ外部のリソースが利用でき動作すると思います。予想です。

0Like

Comments

  1. @kakeruuuun

    Questioner

    自己解決しました。

    Dockerfile
    WORKDIR /workspaces/tutorial
    

    を追加することで対象のディレクトリ上でpoetry installが実行され、仮想環境が利用できるようになりました。
    /直下でpoetry installが実行されてしまい、仮想環境が読み取れなかったみたいです)

    しょうもない原因でした...
    回答頂きありがとうございました。

  2. 解決おめでとうございます。

    因みに、docker composeではビルドをDockerfile、実行をdocker-compose.ymlで分担できるので、転用が便利ですよ。更に複数のコンテナの管理ができて実行が楽です。

    ....
    environment:
      - PATH=/usr/local/bin:
    working_dir: /workspaces/tutorial
    command: 実行コマンド
    

    そして、ビルド&実行は次の3コマンドです。

    docker compose build
    docker compose up -d
    docker compose ls
    

Your answer might help someone💌