- 追加された行はこの色です。
- 削除された行はこの色です。
#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>)