LoginSignup
14
1

More than 3 years have passed since last update.

DockerfileでPoetryを使用して依存関係パッケージをインストールする

Last updated at Posted at 2020-12-03

この記事はZeals Advent Calendar2020の3日目の記事です。見ていただきありがとうございます!

今回はPipenvの代替やら色々言われているPoetryをDocker上で使用する方法を書いていきます。
また、この記事はほとんど公式ドキュメントやGithubリポジトリのissueを参考にしています。正確な情報を知りたいのであれば、ぜひ公式ドキュメントを読んでみてください。
https://python-poetry.org/

記事を書いたときの動作環境

  • MacOS Big Sur 11.0.1
  • Docker for Mac 2.5.0.1

この記事の流れ

今回はこのような流れで開発していきます。
Poetryのインストール方法
Poetryの設定
Poetryの環境を作成
pyproject.tomlへのパッケージ追加
DockerFileを書く

Poetryのインストール方法

PoetryのインストールはcURL推奨です。pipを使ってインストールのほうが楽ではあるんですが、非推奨である理由として、

  1. 使用したいPythonのバージョンごとにPoetryをインストールして切り替える必要がある
  2. コンフリクトする可能性のあるパッケージをインストールしてしまうから

らしいです。

ローカル上でdependencieなどを記載していきたいため、まずはローカルにPoetryをインストールしていきます。

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

次に、PATHを通します。

export PATH="$HOME/.poetry/bin:$PATH"

これでPoetryを使える準備が出来ました。


Poetryの設定

Poetryの環境を作成

このコマンドを叩くことで、pyproject.tomlをインタラクティブに作成できます。好みに合わせて答えていきましょう。

poetry init


pyproject.tomlが生成されたので、次にdependenciesに使用するPythonのVersionを宣言します。明示的に宣言しないと、Poetryが処理できないためです。

[tool.poetry.dependencies]
python = "~3.8"

このチルダは、Pythonのバージョンを >=3.8.0 <3.9.0 の間でバージョンを指定しています。
詳しくは公式ドキュメントを読んでください。

また、このバージョンの書き方について詳しく知りたい方は、SemVer(セマンティック バージョニング)で調べてみてください。


一旦ここまでのpyproject.tomlはこんな感じです

[tool.poetry]
name = "test"
version = "0.1.0"
description = "test"
authors = ["ssab"]

[tool.poetry.dependencies]
python = "~3.8"  # docker imageのpython versionと統一しておく
requests = "~2.24.0"


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


pyproject.tomlへのパッケージ追加

pyproject.tomlへパッケージを追加するときは下記コマンドを叩きます。

poetry add <package name>


バージョンを指定してインストールをしたいときは、下記のようにします。

poetry add requests@2.24.0

インストールに成功すると、パッケージが自動的にpyproject.tomlに記載されます。また、自動的に依存関係のパッケージのバージョンが記載されたpoetry.lockファイルが生成されます。

poetry.lockファイルはgitで管理することで、他の開発者とも依存関係のバージョンを強制することができます。そのため、ぜひ使っていくといいと思います。
poetry.lockの管理の是非については、公式ドキュメントにいいことが書いてあるので、色々疑問などがある方は是非読んでみてください。https://python-poetry.org/docs/basic-usage/#installing-without-poetrylock

そして補足です。no-dependenciesは、本番環境に上げる必要はないよ!みたいなパッケージを追加するといいと思います。たとえばflake8やpytestなどです。
なぜかというと、

poetry install --no-dev

と書くことで、no-dependenciesに書いたパッケージはインストールせずに済むからです。


Dockerfileを書く

FROM python:3.8-slim AS builder
RUN apt-get update && apt-get -y install \
    curl

RUN curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python -
ENV PATH="/root/.poetry/bin:$PATH"
WORKDIR /tmp
COPY pyproject.toml poetry.lock /tmp/
RUN poetry config virtualenvs.create false
RUN poetry install

こんな感じです。わりとシンプルに。

Dockerfileからイメージの作成

Dockerfileからイメージを作成できるか試してみます。

docker build .

これでエラーが出なければ、無事イメージの作成に成功です。

終わりに

今回Poetryに移行した理由として、TrivyでDocker image全体の脆弱性スキャンをするためでした。
Poetryを導入することでTrivyを使うことができるメリットも享受できるので、興味を持った方はぜひ!

14
1
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
14
1