Help us understand the problem. What is going on with this article?

あえてdockerにpipenv環境を作る

More than 1 year has passed since last update.

私がpythonを始めた7月頃にはpipenvを活用するチュートリアルがそこそこに登場していました。pythonにもphpで言うところのcomposerがあることに感動しましたが、まずは実績のあるpipを活用してきました。pipでも事足りることが分かったのですが、ライブラリの依存関係が分かりにくい事に不満があります。そこで、dockerにpipenvで環境を構築してみたいと思います。

この記事でしないこと

pipenvの導入目的

  • pipenv graph でライブラリの依存関係をわかりやすくする事

dockerでpipenvは2重の仮想化になるでのはないかの問いに関して

  • こちらの記事 で知ったが、--systemオプションを使うことで、pipenvの仮想環境ではなくシステムの pipコマンドを使用したインストールができるのことが分かった
  • ただし、--systemするとpipenv graphするのに一手間が増えた(後述)

作成した環境で動作確認したこと

  • pipenv graph
  • pipenv.lockの更新
  • test.pyを実行してhello world

pipenv graphできたので、構成を説明する

ディレクトリ構成

$ tree
.
├── Makefile
├── docker
│   ├── Dockerfile
│   ├── Dockerfile_base
│   ├── Dockerfile_pipenv_gragh
│   └── Dockerfile_update_dependency
└── main
    ├── Pipfile
    ├── Pipfile.lock
    └── test.py

各ファイルの内容

Makefile

  • やっていること
    • application-run
      • pythonファイルの実行
    • application-update-dependency
      • Pipfile.lock を更新する
    • application-graph
      • pipenv graphする
Makefile
PYTHON_FILE := $(PYTHON_FILE)

IMAGE_NAME = python_application
IMAGE_NAME_BASE = $(IMAGE_NAME)_base
IMAGE_NAME_PIPENV = $(IMAGE_NAME)_pipenv
CONTAINER_NAME = python_application

application-build-base:
    docker build . -f docker/Dockerfile_base\
     -t $(IMAGE_NAME_BASE):0.1

application-build: application-build-base
    docker build . -f docker/Dockerfile\
     -t $(IMAGE_NAME):0.1

application-build-update-dependency: application-build-base
    docker build . -f docker/Dockerfile_update_dependency\
     -t $(IMAGE_NAME):0.1

application-build-pipenv-gragh: application-build-base
    docker build . -f docker/Dockerfile_pipenv_gragh\
     --no-cache \
     -t $(IMAGE_NAME_PIPENV):0.1

application-update-dependency: application-build-update-dependency
    docker run -it --rm --name $(CONTAINER_NAME) \
    -v `pwd`/main:/main \
    $(IMAGE_NAME):0.1 \
    pipenv lock

application-run: application-build
    docker run -it --rm --name $(CONTAINER_NAME) \
    -v `pwd`/main:/main \
    $(IMAGE_NAME):0.1 \
    python $(PYTHON_FILE)

application-graph: application-build-pipenv-gragh
    docker run -it --rm --name $(CONTAINER_NAME) \
    -v `pwd`/main:/main \
    $(IMAGE_NAME_PIPENV):0.1 \
    pipenv graph

Dockerfile_base

  • やっていること
    • pipenv のinstall
Dockerfile_base
FROM python:3.7

RUN pip install --upgrade pip && pip --version
RUN pip install pipenv && pipenv --version

Dockerfile

  • やっていること
    • Pipfile.lockを元にしたシステムpipでのinstall
Dockerfile
FROM python_application_base:0.1

COPY main /main
WORKDIR main

COPY main/Pipfile Pipfile
COPY main/Pipfile.lock Pipfile.lock

RUN set -x && \
    pipenv install --system

Dockerfile_pipenv_gragh

  • やっていること
    • Pipfile.lockを元にしたpipenv仮想環境へのinstall
Dockerfile_pipenv_gragh
FROM python_application_base:0.1

COPY main /main
WORKDIR main

COPY main/Pipfile Pipfile
COPY main/Pipfile.lock Pipfile.lock

RUN set -x && \
    pipenv install

Dockerfile_update_dependency

  • やっていること
    • Pipfileを元にしたシステムpipでのinstall
Dockerfile_update_dependency
FROM python_application_base:0.1

COPY main /main
WORKDIR main

COPY main/Pipfile Pipfile

RUN set -x && \
    pipenv install --system --skip-lock

Pipfile

  • やっていること
    • pandasのinstall
Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
pandas="*"

[requires]
python_version = "3.7"

動作確認結果

pipenv graph

pipenv graghするときだけ、pipenvの仮想環境を使うことで、pipenv graghできた。

pandas==0.23.4
  - numpy [required: >=1.9.0, installed: 1.15.4]
  - python-dateutil [required: >=2.5.0, installed: 2.7.5]
    - six [required: >=1.5, installed: 1.11.0]
  - pytz [required: >=2011k, installed: 2018.7]

systemオプション使用すると以下のエラーが出た

Warning: No virtualenv has been created for this project yet! Consider running `pipenv install` first to automatically generate one for you or see`pipenv install --help` for further instructions.
make: *** [application-graph] Error 1

pipenv.lockの更新

  • 問題なく更新できた

test.pyを実行してhello world

  • make application-run PYTHON_FILE:=test.py すると、hello worldできた

感想

pipenv graghするときはpipenvの仮想環境が必要なので思ってたんと違った。多少複雑になったが、ライブラリの依存関係が表現のメリットが勝りそうなので使っていきたい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした