오프라인 환경에서 Anaconda 가상환경 복사하기
보안상의 이유로 오프라인 환경에서 개발환경을 세팅하는 것은 인터넷망에서 개발하는 것보다 체감상 10배는 어렵고 골치아프다. 인터넷망에서 명령어 한줄로 끝나는 것을 오프라인 환경에서 하려면 파일도 일일이 옮겨야 하고 의존성 패키지를 설치하다 꼬이기 시작하면 시간을 엄청나게 잡아먹기 때문이다.
기본적으로 일하는 환경 자체가 네트워크가 차단되어 있기 때문에 늘 환경세팅하는데 어려움이 있다. 그 중에서 python 가상환경을 옮기는 일이 귀찮은데, 인터넷 망에서는 패키지 리스트를 export 해서 그대로 인스톨하면 그만이지만 오프라인 환경에서는 통째로 압축해서 이동시키는 작업이 필요하다.
이번 포스팅에서는 conda 가상환경을 옮기는 방법을 정리한다. anaconda 문서에서 제공하는 정석적인 방법과 내 나름대로 이동시킨 방법을 공유하고자 한다.
Anaconda 가이드
1. conda-pack 설치
먼저 conda-pack 이라는 패키지 설치가 필요하다. 문제는 오프라인 환경이라는 것인데, 미러 서버가 존재한다면 인터넷망과 같은 방식으로 설치하면 되고 그렇지 않다면 외부에서 설치파일을 옮겨서 오프라인 설치를 해야 한다.
설치는 conda를 사용하는 방법과 PyPI를 사용하는 방법 2가지가 있다.
conda install -c conda-forge conda-pack
pip install conda-pack
내가 테스트한 환경의 경우 conda repository 미러 서버는 없고 PyPI 미러 서버는 존재했기 때문에 후자의 방법으로 conda-pack을 설치했다. 만약 패키지 설치파일을 다운받아서 이동시키고자 한다면 pip download
명령어를 검색해보길 바란다. 정확하진 않지만 아마 아래와 같이 실행하면 whl 파일을 받을 수 있을 것이다.
pip download conda-pack
2. packing
이제 conda-pack을 사용해서 기존 가상환경을 압축한다. 가이드에서 제공하는 방법은 아래 3가지이다. 특별한 것은 없고 압축시 파일명과 경로를 지정하는 방법을 나열한 것이다.
# Pack environment my_env into my_env.tar.gz
$ conda pack -n my_env
# Pack environment my_env into out_name.tar.gz
$ conda pack -n my_env -o out_name.tar.gz
# Pack environment located at an explicit path into my_env.tar.gz
$ conda pack -p /explicit/path/to/my_env
packing이 끝났다면 my_env.tar.gz 파일이 생겼을 것이다.
3. 압축파일 이동
my_env.tar.gz를 옮기고자 하는 서버(machine)로 복사한다. 나의 경우는 $ANACONDA_HOME/envs 에 복사했다.
4. restore
아래는 공식 문서에서 제공하는 방법이다. 필수적인 것은 가장 위에 있는 압축을 푸는 작업이다. $ANACONDA_HOME/envs
에 가상환경 디렉토리를 생성하고 (mkdir -p my_env
) 복사한 압축파일을 해당 디렉토리에 압축해제한다(tar -xzvf my_env.tar.gz -C my_env
). 진행상황을 보기 위해 v
옵션을 추가해서 실행했다.
# Unpack environment into directory `my_env`
$ mkdir -p my_env
$ tar -xzf my_env.tar.gz -C my_env
# Use Python without activating or fixing the prefixes. Most Python
# libraries will work fine, but things that require prefix cleanups
# will fail.
$ ./my_env/bin/python
# Activate the environment. This adds `my_env/bin` to your path
$ source my_env/bin/activate
# Run Python from in the environment
(my_env) $ python
# Cleanup prefixes from in the active environment.
# Note that this command can also be run without activating the environment
# as long as some version of Python is already installed on the machine.
(my_env) $ conda-unpack
5. python, pip 경로 확인
python과 pip 버전이 정상적으로 출력되는지 확인한다.
python -V
pip -V
정상적으로 출력된다면, 참조하고 있는 경로가 가상환경 내 python과 pip를 가리키고 있는지도 확인한다.
which python
which pip
python과 pip 참조 경로가 $ANACONDA_HOME/envs/my_envs/bin
을 가리키고 있다면 정상이다. 위의 가이드(4번)에서는 마지막에 conda-unpack을 실행해서 prefix를 cleanup 하라고 되어 있는데, 지금처럼 python과 pip 경로가 정상적으로 잡혀 있다면 굳이 실행할 필요는 없을 것 같다.
혹여나 경로가 안잡혀 있거나 잘못 잡혀 있다면, 아래처럼 편집기를 열고 가장 상단의 경로를 $ANACONDA_HOME/envs/my_envs/bin
로 변경해준다.
sudo vi $ANACONDA_HOME/envs/my_envs/bin/pip
conda-pack을 사용하지 않는 방법
기존 환경
가상환경 정보를 확인한다.
conda info
가상환경 디렉토리로 이동한다.
아래 경로는 예시일뿐, 각자 환경에 따라 경로는 다르다.
cd /opt/anaconda3/envs
복사를 원하는 가상환경을 압축한다.
여기서는 test라는 이름의 가상환경을 test.tar.gz
로 압축
tar cfvz test.tar.gz test
c
: 새로운 아카이브(tar) 생성f
: 파일 이름 지정v
: 압축시 진행률 표시z
: gzip 압축 및 압축해제
타겟 서버
가상환경을 복사할 서버에 접속한뒤, 해당 서버에 설치된 anaconda 경로로 이동한다. 가상환경 디렉토리로 이동할 것이므로 anaconda 홈 디렉토리에서 envs 디렉토리로 들어간다.
cd ~/anaconda3/envs
해당 폴더에 위에서 압축한 파일을 복사해서 넣고, 압축을 해제한다.
tar xvf test.tar.gz
x
: 압축 해제v
: 진행률 표시f
: 파일 이름 지정
그 후 압축파일을 제거한다.
rm -rf test.tar.gz
가상환경 목록을 확인한다
conda env list
복사한 가상환경을 활성화한다.
conda activate test
가상환경이 있던 서버의 python 환경과 가상환경이 옮겨진 서버의 python 환경이 다를 수 있다. 예를들면 (나의 경우) pip의 참조 python 경로가 달라서 pip 명령어를 실행할 수 없었다.
python 버전과 경로를 확인한다.
which python
버전은 (현재 서버의 default python과)다를 수 있지만 경로는 가상환경 내 python이기 때문에 $ANACONDA_HOME/bin
을 가리키고 있어야 한다.
마찬가지로 pip 버전과 경로를 확인한다.
which pip
역시 경로는 $ANACONDA_HOME/bin
을 가리키고 있어야 한다. 만약 No file or No directory 라는 메세지가 나온다면 경로를 변경해주어야 한다.
가상환경 내 pip가 위치한 경로로 이동한다.
cd $ANACONDA_HOME/envs/{virtual_env_directory}/bin
pip 파일을 편집기로 열면
vi pip
최상단에 경로가 이전 서버의 anaconda home 경로로 되어 있을 수 있으니, 이를 현재 서버의 경로로 변경한다.
Reference
아나콘다 오프라인 가상환경 생성 , 가상환경 추출 및 설치