この記事は「Dockerコンテナ上に開発環境一式を構築する」の一部です。
現在のステータス
- VPSにホストにUbuntuを入れる
- dnsを構築する
- nginxを構築する
- GitBucket環境を構築する
- Selenium用のJenkins環境を構築する <-イマココ
- Desktop環境(IntelliJ IDEA)を構築する
Dockerfile
Java8の公式イメージはjava:8で入るようです。これはbuildpack-deps:jessie-scmをベースにしています。Jenkinsの公式イメージはjenkins:latestですね。これはjava:8-jdkがベースになっています。コンテナごとにいろいろ環境に差異があると余計な手間になりかねないのでubuntu14.04を使います。次のLTSである16.04が出たらアップデートを考えます。
# Jenkins Dockerfile
FROM ubuntu:14.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -y upgrade
ENV HOME /root
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
# Install.
RUN apt-get install -y build-essential software-properties-common
RUN apt-get install -y byobu curl git htop man zip unzip wget
# Install java 8
RUN add-apt-repository ppa:webupd8team/java -y && apt-get update
RUN (echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections) && apt-get install -y oracle-java8-installer oracle-java8-set-default
# X frame buffer & firefox & chrome
RUN apt-get install -y Xvfb firefox fonts-ipafont
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update
RUN apt-get install -y google-chrome-stable
#user
ENV USER jenkins
RUN /usr/sbin/useradd $USER
# time
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
Java8の後にXvfb等を入れてます。chromeはそのままではapt-get installできないのでdepを取って来ます。
#/bin/sh
. ../../setenv.sh
CONTAINER=jenkins
cd $DOCKER_HOME/$CONTAINER/docker
docker build --force-rm -t "lavans-$CONTAINER:latest" .
ちなみにこれを作っている最中にglibcのバグの件でパッケージが見つからないエラーがでました。docker build --no-cache
オプションをつけてapt-get update
を再実行させることで解消しました。
$ chmod 755 build.sh
$ ./build.sh
jenkins本体の用意
#/bin/sh
mv jenkins.war jenkins.war.1
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
起動終了スクリプト
#/bin/sh
. ../setenv.sh
CONTAINER=jenkins
docker run -v $DOCKER_HOME/$CONTAINER:/home/$CONTAINER -u $CONTAINER -d \
-v /dev/shm:/dev/shm -e HOME="/home/$CONTAINER" --privileged \
--name $CONTAINER -p 8081:8080 --dns=$DNS \
lavans-$CONTAINER java -Xmx512m -Djava.awt.headless=true -Duser.timezone=Asia/Tokyo -jar $CONTAINER.war
-v /dev/shm:/dev/shm
は仮想メモリをコンテナにマウントさせます。2016/02時点でdockerでは64MBにハードコーディングされているようで、デフォルトでchromeを動かすとすぐに落ちてしまいます。--privileged
はコンテナを特権モードにするオプションで、これがないとchrome起動時に--no-sandbox
オプションが必要になります。-Duser.timezone
を指定しておかないとjenkinsのコンソールがUTCになってしまいます。
起動するプロセスはDockerfileのCMDに書いておいてrun.shで上書きできるのがいいかなと思っていたのですが、オプションをいろいろトライする時にいちいちビルドしなおすのは面倒なのでrun.shに書いておくのがいいかもしれません。
#!/bin/sh
CONTAINER=jenkins
docker kill $CONTAINER; docker rm $CONTAINER
参考