#mynavi(Python覚え書き) #setlinebreak(on); * 概要 [#p4f7695f] #html(<div class="pl10">) 別の環境で作成した pyenv 環境をまるごとコピーして別環境に配置した場合に問題なく利用できるか確認してみた。 [前提] - OSの種類、バージョンは同じとする - pyenv を使用するユーザ名は同じとする #html(</div>) * 目次 [#w75a7135] #contents - 関連 -- [[Python覚え書き]] * 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 のインストールするしていないが、問題なく使用できた。 コピー先の環境では python のインストールすらしていないが、問題なく使用できた。 ※OS、ユーザのホームディレクトリが同じであれば、問題なく使用できそう。 ※依存ライブラリまで結合してビルドされたバイナリが .pyenv 環境配下にできている模様。 別ユーザだとダメっぽい。( .pyenv 配下のファイルに コピー元の pyenv の path情報まで含まれている模様 ) #myterm2(){{ grep -r "/root/.pyenv" ~/.pyenv/ | wc -l 4987 }} #html(</div>) #html(</div>)