우리 회사는 보안이 강하다. 정말 너무 강하다. 금융권이라서 어쩔 수 없다지만, 생각보다 쉽지 않다.

데이터를 수집하는 코드를 분석하기 위해 Pycharm을 사용하고 Debugging을 하려 했지만, Remote interpreter를 사용할 수가 없었다. 해당 데이터는 지정된 한 서버에서만 받을 수 있었기 떄문에, Pycharm Docker interpreter도 사용할 수가 없다. 결국 서버에서 console 개발환경을 구축하기 시작했다. 하지만 Emacs, zsh 버전이 너무 낮아, 결국 Docker(Ubuntu 20.04)에 설치를 했다.

업무보다 환경설정이 역시 더 어렵다 ㅋㅋ..

1. Objective

  • Install Emacs & Zsh on Docker(Ubuntu 20.04)
  • pesudo-tty로 직접 접근해서 설치
  • Docker 파일 사용 버전은 맨 아래(일부 작업은 tty로 진행해야함)

2. Download & Setting Ubuntu

2.1 Download Ubuntu(20.04) Docker & Run

$ docker image pull ubuntu:20.04
$ docker run -it --rm --name <image_name> ubuntu:20.04
# -rm, --name은 optional

2.2 Download Packages

$ apt update
# 다운로드 속도가 너무 느리다면,
# /etc/apt/sources.list에서 "[archive.ubuntu.com](http://archive.ubuntu.com/)" -> "[ftp.daumkakao.com](http://ftp.daumkakao.com/)"으로 변경
# sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list로 변경 가능

3. Install Pyenv

여러 Python Project를 할 때는 Pyenv를 설치하는 것이 편하다.
Pyenv Github 참고

# Install Prerequsite Package
$ apt install curl bash git build-essential make
$ apt install zlib1g-dev libssl-dev libbz2-dev libncurses-dev libreadline-dev libsqlite3-dev

# Install pyenv
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ cd ~/.pyenv && src/configure && make -C src

# Pyenv test
$ pyenv versions # install test
$ pyenv install <version>
$ python --version
Python <version>

4. Install & Setting Zsh

4.1 Install Zsh

$ apt install zsh
$ zsh --version
zsh 5.8 (x86_64-ubuntu-linux-gnu)

4.2 Install oh-my-zsh

Ubuntu에서 설치하는 방법은 Mac과 거의 흡사하다.
Install zsh on Mac 글 참고

설정하다보면, power10k의 Colorful함이 줄어드는데, console의 색상 범위가 줄었기 때문 docker를 실행할 때, “xterm-256color” 환경변수를 설정해야 함

$ docker run --rm -it -e "TERM=xterm-256color" --name <name> ubuntu:20.04

# 여태까지 만든 Docker를 저장하고 싶다면, Host에서 아래 명령어 사용
$ docker commit <container_name>

Ubuntu Docker는 기본 쉘이 bash chsh로 쉘을 변경하거나 bashrc 마지막 줄에 “exec zsh” 삽입

5. Install & Setting Emacs

5.1 Download Emacs & Download Melpa

emacs를 다운로드하고, emacs에서 python project 개발을 위해 많이 사용하는 elpy와 treeview를 지원하는 neotree package를 설치(Melpa 통해서 설치 진행)

$ apt install emacs gnutls-bin -y # for Redhat gnutls-utils
$ cat <<EOF >> .emacs
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
(global-linum-mode)
(setq linum-format "%5d |")
(setq neo-window-fixed-size nil)
(elpy-enable)
(setq elpy-rpc-virtualenv-path 'current)
EOF

# Run emacs & Initialize Package
$ emacs
# In emacs 
M-x package-refresh-contents
M-x package-install neotree
M-x package-install elpy

# elpy 설치 확인은
M-x elpy-config
# 로 확인

6. Dockerfile

zshrc의 theme 설정과 emacs의 package 설정은 직접 interactive terminal에서 직접 진행

FROM ubuntu:20.04

RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt update

RUN apt install curl libssl-dev build-essential make -y
RUN apt install libreadline-dev bash libbz2-dev libncurses-dev -y
RUN apt install libsqlite3-dev git zlib1g-dev -y 

### Install PYENV

RUN git clone https://github.com/pyenv/pyenv.git /root/.pyenv
WORKDIR /root/.pyenv
RUN src/configure
RUN make -C src

ENV PYENV_ROOT=/root/.pyenv
ENV PATH="$PYENV_ROOT/bin:$PATH"
ENV PATH="$PYENV_ROOT/shims:$PATH"

RUN pyenv install 2.7.18
# RUN pyenv install 3.9.6
# RUN pyenv install 3.5.12

# Install Zsh

RUN apt install zsh -y
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
RUN git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
RUN git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting
RUN git clone https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
### Set ~/.zshrc in interactive terminal
### For powerlevel10K, Run Docker with TERM=xterm-256color
### docker run --rm -it -e "TERM=xterm-256color" /bin/bash
ARG DEBIAN_FRONTEND=noninteractive
RUN apt install emacs -y
WORKDIR /root
RUN echo '(global-linum-mode)' >> '.emacs'
RUN echo '(setq linum-format "%5d |")' >> '.emacs'
RUN echo '(setq neo-window-fixed-size nil)' >> '.emacs'
RUN echo '(elpy-enable)' >> '.emacs'
RUN echo "(setq elpy-rpc-virtualenv-path 'current)" >> '.emacs'