10
5

More than 5 years have passed since last update.

あえてdockerにpipenv環境を作る

Last updated at Posted at 2018-12-02

私が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の仮想環境が必要なので思ってたんと違った。多少複雑になったが、ライブラリの依存関係が表現のメリットが勝りそうなので使っていきたい。

10
5
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
10
5