動機
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
でコンテナに入ります。