Edited at

Dockerで作った開発環境で開発する

More than 3 years have passed since last update.


動機

ghcmod-vimが普通にインストールするとなぜかエラーが出て動かなかった。

Dockerできれいな環境を用意してあげると動いたので、Dockerで作った環境の中で開発してる。

cabalで間違えてグローバルにインストールしてもすぐに戻せるし、可搬性も上がるので良いかもしれない。

GUIなエディタを使っている場合はコンテナ内で使えない(?)ので、外でコード書いて中で動かすことになる。

以下、Haskellについて知らなくても問題ないです。


準備

docker execを使うのでdocker1.3以上を使ってください。

「apt-getで入れたいけど、バージョンが古い」という方はUbuntu 14.04 へ Docker のインストール - 作業ノートを見てください。


Dockerfile

ベースとなるUbuntuのイメージと、それに載せる言語のイメージを作る。

FROM ubuntu:14.04

RUN \
sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list && \
apt-get update && \
apt-get -y upgrade && \
apt-get install -y build-essential && \
apt-get install -y software-properties-common && \
#使うものを入れる
apt-get install -y byobu curl git tig htop man unzip vim wget && \
rm -rf /var/lib/apt/lists/* && \
# 今回はpiyoというユーザにする
useradd -m piyo

WORKDIR /home/piyo

ENV HOME /home/piyo
ENV LANG C.UTF-8

USER piyo

CMD ["bash"]

やっていることは


  • apt-getで普段使うようなもののインストール

  • ユーザの作成

  • WORKDIRとHOMEの指定

  • USERの指定

USERを指定しないとrootでログインすることになるため、書いたコードの所有者がrootになってしまいホストから触るのが面倒になります。

LANGを指定しているのはvimのNERDTree文字化けが起きたため。

ubuntuの上に載せる言語用のDockerfile

FROM your_ubuntu

USER root

#RUN \
# echo 'deb http://ppa.launchpad.net/hvr/ghc/ubuntu trusty main' > /etc/apt/sources.list.d/ghc.list && \
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F6F88286 && \
# apt-get update && \
# apt-get install -y --no-install-recommends cabal-install-1.20 ghc-7.8.4 happy-1.19.4 alex-3.1.3 \
# zlib1g-dev libtinfo-dev libsqlite3-0 libsqlite3-dev && \
# rm -rf /var/lib/apt/lists/*

USER piyo

#ENV PATH $HOME/.cabal/bin:/opt/cabal/1.20/bin:/opt/ghc/7.8.4/bin:/opt/happy/1.19.4/bin:/opt/alex/3.1.3/bin:$PATH

#RUN \
# cabal update && \
# cabal install ghc-mod

Haskell用のコマンドはコメントアウトしています。代わりに使う言語のインストールなどを行ってください。

要するにUSERを変えてapt-getしてその後USERを戻してるだけ。


使う

長ったらしいコマンドを打って開発環境に入るのはいやなのでbashのfunctionを書いた。

変数は自分の環境に合わせてください。VIMとかVIMRCとかBASHとかBASHRCとかGITとか

function内のHASKELLが書いたソースの置場。

HOME="/home/piyo"

DOCKER_HOME="/home/piyo"
VIM="-v ${HOME}/.vim:${DOCKER_HOME}/.vim"
VIMRC="-v ${HOME}/.vimrc:${DOCKER_HOME}/.vimrc"
BASH="-v ${HOME}/.bash:${DOCKER_HOME}/.bash"
BASHRC="-v ${HOME}/.bash_profile:${DOCKER_HOME}/.bashrc"
GIT="-v ${HOME}/.gitconfig:${DOCKER_HOME}/.gitconfig"
SET="$VIM $VIMRC $BASH $BASHRC $GIT"

DOCKER="docker run -it --rm"
DOCKER_BACK="docker run -itd"
DOCKER_EXEC="docker exec -it"

function haskell() {
NAME="piyo/haskell"
CONTAINER="haskell"
HASKELL="-v ${HOME}/haskell:${DOCKER_HOME}/haskell"
if [ $# -eq 0 ]; then
$DOCKER_EXEC $CONTAINER bash
elif [ $# -eq 1 ]; then
case
$1 in
"run" ) $DOCKER $SET $HASKELL --name $CONTAINER $NAME ;;
"back" ) $DOCKER_BACK $SET $HASKELL --name $CONTAINER $NAME ;;
"exec" ) $DOCKER_EXEC $CONTAINER bash ;;
esac
fi
}

haskell backでバックグラウンドでコンテナを動かしてhaskell execでコンテナに入ります。