概要

別の環境で作成した pyenv 環境をまるごとコピーして別環境に配置した場合に問題なく利用できるか確認してみた。

[前提]

  • OSの種類、バージョンは同じとする
  • pyenv を使用するユーザ名は同じとする

目次

pyenv環境作成

作業用ディレクトリの作成 及び 移動

mkdir test_pyenv_copy
cd test_pyenv_copy

コンテナ上に pyenv 環境を作成する

ubuntu のコンテナを作成し、pyenv 環境を作成する。
作成した pyenv のコピー用に workディレクトリをボリュームマウントしておく。

pyenvコピー用のワークを作成

mkdir work

コンテナの起動 及び アタッチ

docker run --rm -it -v `pwd`/work:/tmp/work ubuntu:18.04 bash

以下、コンテナ内での作業

# 必要なものをインストール
# (実際は作業途中でエラーになりながら個別にインストールしたが、ここでの本題ではないので纏めた)
apt-get update
apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl gcc make git

# python をソースからインストール
cd /tmp/work
curl https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz -o Python-3.8.1.tgz
tar xzfv Python-3.8.1.tgz
cd Python-3.8.1

./configure
make
make install
ln -s /usr/local/bin/python3 /usr/local/bin/python

# pyenv インストール
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
pyenv versions
* system (set by /root/.pyenv/version)

# pyenv 環境に 3.8.1 をインストール
pyenv install 3.8.1
pyenv versions
* system
  3.8.1 (set by /root/.pyenv/version)

# python 3.8.1 環境に切り替え
pyenv global 3.8.1

# 適当なパッケージをインストール
pip install flask

# 出来上がった pyenv アーカイブして、マウント済みのコピー用ワークに移動
cd ~/
tar czfv pyenv381.tgz .pyenv
mv pyenv381.tgz /tmp/work/

作成した pyenv 環境が別環境で利用できるのか確認

動作確認用の処理を作成しておく

work/app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'root!\n'

@app.route('/sample')
def sample():
    return 'sample!\n'

if __name__ == "__main__":
    app.run()

pyenv 動作確認用のコンテナを作成し pyenv をコピーする

docker run --rm -it -v `pwd`/work:/tmp/work ubuntu:18.04 bash
cd ~/
cp /tmp/work/pyenv381.tgz ./
tar xzfv pyenv381.tgz

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

# flask起動
cd /tmp/work/
python app.py >flask.log 2>&1 &

そのままコンテナ上で動作確認

# 動作確認用に curl をインストール
apt-get update
apt-get -y install curl

curl http://127.0.0.1:5000/
root!
curl http://127.0.0.1:5000/sample
sample!

コピー先の環境では python のインストールすらしていないが、問題なく使用できた。
※OS、ユーザのホームディレクトリが同じであれば、問題なく使用できそう。
※依存ライブラリまで結合してビルドされたバイナリが .pyenv 環境配下にできている模様。

別ユーザだとダメっぽい。( .pyenv 配下のファイルに コピー元の pyenv の path情報まで含まれている模様 )

grep -r "/root/.pyenv" ~/.pyenv/ | wc -l
4987

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-02-25 (火) 23:45:14 (37d)