#author("2020-02-25T10:31:44+00:00","","")
#mynavi(Python覚え書き)
#setlinebreak(on);

* 概要 [#p4f7695f]
#html(<div class="pl10">)

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

[前提]
- OSの種類、バージョンは同じとする
- pyenv を使用するユーザ名は同じとする

#html(</div>)

* 目次 [#w75a7135]
#contents
- 関連
-- [[Python覚え書き]]


pyenvを引っこ抜いて別環境で利用する
* pyenv環境作成 [#i9515f9f]
#html(<div class="pl10">)

** 作業用ディレクトリの作成 及び 移動 [#dda61dd1]
#html(<div class="pl10">)
#myterm2(){{
mkdir test_pyenv_copy
cd test_pyenv_copy
}}
#html(</div>)

** コンテナ上に pyenv 環境を作成する [#j3e7de82]
#html(<div class="pl10">)

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

pyenvコピー用のワークを作成
#myterm2(){{
mkdir work
}}

コンテナの起動 及び アタッチ
#myterm2(){{
docker run --rm -it -v `pwd`/work:/tmp/work ubuntu:18.04 bash
}}

以下、コンテナ内での作業
#myterm2(){{

# 必要なものをインストール
# (実際は作業途中でエラーになりながら個別にインストールしたが、ここでの本題ではないので纏めた)
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/
}}

#html(</div>)

* 作成した pyenv 環境が別環境で利用できるのか確認 [#t770eab2]
#html(<div class="pl10">)

** 動作確認用の処理を作成しておく [#k147cba9]
#html(<div class="pl10">)

work/app.py
#mycode2(){{
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()
}}
#html(</div>)

** pyenv 動作確認用のコンテナを作成し pyenv をコピーする [#kb47d029]
#html(<div class="pl10">)

#myterm2(){{
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 &
}}

そのままコンテナ上で動作確認
#myterm2(){{
# 動作確認用に 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情報まで含まれている模様 )
#myterm2(){{
grep -r "/root/.pyenv" ~/.pyenv/ | wc -l
4987
}}

#html(</div>)

#html(</div>)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS