개발환경을 정리하는 툴 direnv

direnv는 개발환경을 쉽게 정리하는 툴입니다.
헤로쿠의 등장을 기점으로 각종 프로그램의 설정은 환경변수를 이용하는 게 보편화 되었고 그 환경변수는 .env 파일에 저장하는 게 일반적입니다.
헤로쿠의 경우 foreman을 이용해 로컬에서 개발서버를 돌려 볼 때 자동적으로 .env를 읽어서 환경변수로 지정한 뒤에 실행하게 되고 파이썬 같은 경우 honcho라는 클론 버전이 있습니다.

하지만 개발서버를 돌리는 일 외에 DB 마이그레이션(eg: 장고의 ./manage.py migrate)등을 해야 할 때도 그 환경변수를 지정해야 할 일이 생겼고 그 때마다 honcho run ./manage.py migrate 등의 일을 하기란 굉장히 불편합니다.
그래서 해당 디렉터리에 들어갈 때 자동적으로 .env를 로드해 주는 autoenv라는 툴이 나왔습니다만, 이 툴은 해당 디렉터리를 빠져나갈 때 unload를 시켜주지 않는 문제가 있습니다.

그런 배경을 가지고 direnv가 나오게 된 것인데 이 툴은 기본적으로 디렉터리를 빠져나갈 때 unload를 해 주는 것은 물론이고 현대 개발언어 환경에 유용한 기능들을 많이 가지고 있습니다.
Python 개발의 경우 대부분 venv를 어떤 식으로든 사용을 하게 되는데 해당 디렉터리에 들어 갈 때마다 이를 활성화 해 주는 일도 여간 귀찮은 게 아닙니다. pyenv를 사용해서 .python-version을 이용하는 방법도 있지만 개인적으로 pyenv-virtualenv는 가상환경을 ~/.virtualenvs 밑에 만드는데 프로젝트를 삭제할 때 이 venv가 같이 삭제가 안 되는 게 좀 껄끄럽습니다. 일종의 강박증이죠.
direnv는 .envrc 파일에 layout python을 적어 넣으면 자동적으로 숨겨진 디렉터리(./.direnv) 안에 venv를 만들어 주고 해당 디렉터리에 들어가 있을 때만 활성화를 시켜 줍니다.
짜잔! 드디어 파이썬도 npm이나 bundle처럼 디렉터리마다 자동적으로 따로 관리 되는 개발환경을 가질 수 있게 되었군요!
direnv example
python 이외에 다른 언어들도 지원합니다. 자세한 내용은 해당 프로젝트의 wiki 페이지를 참고하시면 됩니다.

direnv의 문제

layout python 등의 명령어가 있으므로 .env를 사용하지 않고 .envrc를 사용하는 건 이해가 가지만 .envrcdotenv를 적어주지 않으면 .env에 적힌 환경변수를 로딩하지 않는 게 기본 설정입니다. 왜 이렇게 동작하는지 모르겠지만 전역 설정(~/.config/direnv/direnvrc or ~/.direnvrc)에 dotenv를 적어봤는데 내가 있는 디렉터리를 기준으로 .env를 읽어 오는 게 아니라 이 설정파일의 위치를 기준으로 읽어오기 때문에 사용할 수 없습니다.

Ubuntu 17.04 Systray fix

Ubuntu 17.04 zesty has a lot of changes. System tray is one of them and it has some problems to use it.

  • Dropbox menu doesn’t appeared.
  • Other Icons are not appeared on system tray.

Way to fix it

Temporarily: Set an environment variable like this: XDG_CURRENT_DESKTOP=Unity.
ex) XDG_CURRENT_DESKTOP=Unity dropbox start -i

permanently: Append XDG_CURRENT_DESKTOP=Unity to ~/.pam_environment file. It is like X version of .profile Usually, It has system locale settings.


우분투 17.04 zesty는 많은 변화가 있었고 시스템 트레이에 생긴 문제도 그 중 하나입니다. 대표적으로 드랍박스의 아이콘을 누르면 나오는 메뉴가 아무 것도 안 뜨고 다른 앱들은 아이콘조차 뜨지 않는 경우도 있습니다.
해결 방법은 앱을 실행할 때 XDG_CURRENT_DESKTOP 환경변수를 Unity로 세팅하는 것입니다.
임시적인 방법으로 셸에서 실행할 땐 XDG_CURRENT_DESKTOP=Unity dropbox start -i 같은 방법으로 실행할 수도 있고 모든 앱에 적용하려면 ~/.pam_environment파일에 XDG_CURRENT_DESKTOP=Unity라고 한 줄을 더 적어주시면 됩니다. 이 파일은 셸에서 ~/.profile과 비슷한 역할을 하는 파일입니다. 보통 시스템 언어설정 등이 담겨 있습니다.

Fix Docker DNS problem

My school blocks DNS request packets to any host except school’s DNS server.
But many Docker image uses 8.8.8.8 and 8.8.4.4 as DNS server.

append --dns a.b.c.d to docker run command fix this problem temporarilly. But this option cannot be used on build command. So I have to use another solution.

Append --dns a.b.c.d to docker daemon command.

# /etc/default/docker
DOCKER_OPTS="--dns a.b.c.d"

Update – 2017-08-20

Just use /etc/docker/daemon.json to do this:

{
  "dns": ["a.b.c.d"]
}