5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

condaが管理するpythonを固定する

Posted at

conda install hogehogeをした際に予定外のパッケージ(というかpython)が更新されて全体が死んだので,備忘録がてら対策を書いておきます.

顛末

やりたかったこと: pytorchのdockerイメージをもとに,いくつかライブラリを足した自前イメージを作りたかった

やったこと: Dockerfile内に素直にconda installを書いた
おきたこと: conda install時にpythonのバージョンが変わってしまい,conda環境が破損?してまともに使えなかった

げんいん: condapythonのバージョンにミスマッチが起きた
やらなければならなかったこと(結論): pinnedというファイル内に固定したいものを書いておく (今回はpython==3.6.*で解決)
(もしくは更新されるpythonのバージョンに合うcondaも一緒に入れる; 今回は未実施; 参考リンクの一番下)

参考

Is it possible to lock versions of packages in Anaconda? - Stack Overflow
How to pin Conda | Damian's blog
condaのpython versionを変更する時の注意点 - Qiita

やったこと詳細

以下のようなDockerfileを書きました(使ってる元イメージが古いのも問題の一部かもしれませんね……).

FROM pytorch/pytorch:0.4.1-cuda9-cudnn7-devel

RUN apt update && apt upgrade -y

# 後々ここが問題になります
# joblib etc
RUN conda install -y \
    joblib \
    matplotlib \
    scikit-learn \
    tqdm

で,ビルド.

$ docker build -t mypytorch .

この際,conda installではアップデートされるパッケージとしてこいつらが表示されました(後々問題になる部分).

The following packages will be UPDATED:

    ca-certificates:  2018.03.07-0            --> 2020.1.1-0
    certifi:          2018.4.16-py36_0        --> 2019.11.28-py38_0
    freetype:         2.9.1-h8a8886c_0        --> 2.9.1-h8a8886c_1
    libedit:          3.1.20170329-h6b74fdf_2 --> 3.1.20181209-hc058e9b_0
    libgcc-ng:        7.2.0-hdf63c60_3        --> 9.1.0-hdf63c60_0
    libpng:           1.6.34-hb9fc6fc_0       --> 1.6.37-hbc83047_0
    libstdcxx-ng:     7.2.0-hdf63c60_3        --> 9.1.0-hdf63c60_0
    mkl:              2018.0.3-1              --> 2020.0-166
    mkl_fft:          1.0.4-py36h4414c95_0    --> 1.0.15-py38ha843d7b_0
    mkl_random:       1.0.1-py36h4414c95_1    --> 1.1.0-py38h962f231_0
    ncurses:          6.1-hf484d3e_0          --> 6.2-he6710b0_0
    numpy:            1.14.5-py36h1b885b7_4   --> 1.18.1-py38h4f9e942_0
    numpy-base:       1.14.5-py36hdbf6ddf_4   --> 1.18.1-py38hde5b4d6_1
    openssl:          1.0.2o-h20670df_0       --> 1.1.1d-h7b6447c_4
    pip:              10.0.1-py36_0           --> 20.0.2-py38_1
    python:           3.6.5-hc3d631a_2        --> 3.8.1-h0371630_1
    readline:         7.0-ha6073c6_4          --> 7.0-h7b6447c_5
    scipy:            1.1.0-py36hc49cb51_0    --> 1.4.1-py38h0b6359f_0
    setuptools:       39.2.0-py36_0           --> 45.2.0-py38_0
    six:              1.11.0-py36h372c433_1   --> 1.14.0-py38_0
    sqlite:           3.23.1-he433501_0       --> 3.31.1-h7b6447c_0
    tk:               8.6.7-hc745277_3        --> 8.6.8-hbc83047_0
    wheel:            0.31.1-py36_0           --> 0.34.2-py38_0
    zlib:             1.2.11-ha838bed_2       --> 1.2.11-h7b6447c_3

おきたこと詳細

ビルドが終わったので意気揚々とコンテナを作ります.

$ docker run -it --rm mypytorch bash

コンテナ内でconda系のコマンドを使おうとするとあら不思議,動きません.

root@ce88f6b1ba73:/workspace# conda
Traceback (most recent call last):
  File "/opt/conda/bin/conda", line 7, in <module>
    from conda.cli import main
ModuleNotFoundError: No module named 'conda'

その他ipythonが動かなかったり,仕方ないので以下のようにpythonから試そうとしてもだめだったり.

root@ce88f6b1ba73:/workspace# python
Python 3.8.1 (default, Jan  8 2020, 22:29:32)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'torch'
>>>

ということで,動かしたいものがなにひとつ動かない状態のイメージが出来上がってしまいました.

やらなければならなかったこと

ここが問題でした.pythonのバージョンが3.8.1に更新されています.

The following packages will be UPDATED:

...
    python:           3.6.5-hc3d631a_2        --> 3.8.1-h0371630_1
...

どうもcondaのバージョンを変えないままpythonだけが更新されると動かなくなってしまうようです.解決には以下のふたつの方法があります.

  1. condapythonを一緒に更新する
  2. pythonのバージョンを固定する

今回はバージョンを固定するほうでいきます.バージョンの固定には,anaconda/minicondaの管理ディレクトリ以下conda-meta/pinnedに固定したいものを書けばOKです(複数の環境を作っている場合どういう扱いになるかは未検証です).

今回はpythonを3.6系に固定するため,以下のようになります(ここではインストール先が/optです.これはお使いの環境によって異なります).

$ echo "python=3.6.*" >> /opt/conda/conda-meta/pinned

これがDockerfileに入っていればうまくいきます.つまり以下のようになります.

FROM pytorch/pytorch:0.4.1-cuda9-cudnn7-devel

RUN apt update && apt upgrade -y

# conda install前にバージョンを固定
RUN echo "python=3.6.*" >> /opt/conda/conda-meta/pinned

# joblib etc
RUN conda install -y \
    joblib \
    matplotlib \
    scikit-learn \
    tqdm

あまり多くはおきない事故だとは思いますが,誰かの参考になれば幸いです.

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?