Dockerとpipenvでの開発中 罠にハマった

プログラミングでお金をもらうようになったちゅんです。

Djangoでいろいろしてるのですが、つい先日(12月3日くらい?)にDjango3.0とかいうのが出たんですよ。

「ふーーーん まぁ今やってるプロジェクト終わったら個人的に触ってみるか」程度でスルーしてたら自分の開発にも影響があって焦りまくったお話です。

本題

環境

  • Docker-Compose
  • pipenv

何があったか

Docker触ったことなかったので「Dockerなにそれわからん~」って言いながらDockerfileを書くのを人に任せていたんですね。(これ重要)

プロジェクト開始時時点での最新バージョンDjango 2.2.7を使っていたのですが、インストール時にバージョン指定せずにインストールしていたんですね。

pipenv install django

って実行するとPipfileにdjango = "*"って記入されるんですが、これって最新のバージョンを取ってくる意味でして…

  1. Django最新版をインストールするように指定(当時は2.2.7)
  2. Django 3.0がリリースされる(最新版が3.0に変わる)
  3. Django最新版をインストールする(3.0)

何も考えずにDockerで動かしてみたらエラーを吐いてしまって「は?」ってなるんですけどver2.2.7のコードはver3.0で動くわけもないんですね。

これはバージョンがいかんのかと思って2.2.7をインストールするように指定し直さなあかんなって思って

pipenv uninstall django
pipenv install django==2.2.7

ってインストール時指定してあげればDockerくんも2.2.7をインストールしてくれるだろうな~と思ってたらいつまで経っても3.0をインストールしてて仕事中にPC破壊しかけました。

pipenv install

と打つとカレントディレクトリにあるPipfile・Pipfile.lockを探して自動でインストールしてくれます。(前提知識)

pipenv installコマンド打つとPipfileに書いてある物を自動的にインスコしてくれると思っていたんです。(ここも重要)

なんで変更が適用されないんだろうか原因究明を急ぎました。

原因

ふと人に書いてもらったDockerfileを見ると

RUN pipenv install --skip-lock --system --dev

って書いてあって、

  • --skip-lock : Pipfile.lockを使わずにインストール
  • --system : 仮想環境ではなくデフォルトのPythonにインストール
  • --dev : dev-packageもインストール

--skip-lockオプションが原因でした。

Pipfile.lockがバージョン周りの情報を扱うらしいです。

解決

Dockerfileを

RUN pipenv install --system --ignore-pipfile --deploy

に書き換えてちゃんとDjango 2.2.7がインストールされ動くようになりました。

まとめ

  • 人の書いたファイルもしっかり目を通そう
  • 人任せにしちゃダメだ
  • サイトからコピペするにしてもオプション周りは自分で調べて自分に合ったものを使おう
  • パッケージをインストールするときはなるべくバージョン指定しよう