Edited at

オレオレdocker開発環境を作ってみた

俺が使う俺のためのオレオレdocker イメージを作った


  • マイナーで容量もでかいarchlinuxベース

  • 日本語環境適用


  • 自分のdotfiles適用


ベースイメージと自分の作ったカスタムイメージの親子関係

base/archlinux              latest      1.59GB

└── u1and0/archlinux latest 2.25GB
├── u1and0/zplug latest 2.41GB
└── u1and0/neovim latest 2.67GB
└── u1and0/vim-go latest 3.39GB



u1and0/archlinux

archlinuxpng



  • base/archlinuxをベースにしました。


  • u1and0/dotfiles を適用しています。

  • pacmanによる公式パッケージだけでなく、yayによるAURパッケージのインストールも可能です。

  • パッケージダウンロード元サーバーをreflectorで選択したファイルを/etc/pacman.d/mirrorlistに適用しています。(更新日2019.02.01)

  • ロケール日本語 > helpとかが日本語表示(しかしmanのインストールでエラー。manを日本語どころか英語でも見れない。解決策模索中)

# Usage:

# docker run -it --rm -v `pwd`:/work -w /work u1and0/archlinux
#
# For building:
# docker build --build-arg BASE="2019.01.01"\
# BRANCH="v1.13.5" USER="u1and0" -t u1and0/archlinux .

ARG BASE="latest"
FROM base/archlinux:${BASE}

# Japanese setting
ENV LANG="ja_JP.UTF8"\
LC_NUMERIC="ja_JP.UTF8"\
LC_TIME="ja_JP.UTF8"\
LC_MONETARY="ja_JP.UTF8"\
LC_PAPER="ja_JP.UTF8"\
LC_MEASUREMENT="ja_JP.UTF8"
# Get reflector Server setting for faster download
# Same as `reflector --verbose --country Japan -l 10 --sort rate`
COPY mirrorlist /etc/pacman.d/mirrorlist
RUN echo ja_JP.UTF-8 UTF-8 > /etc/locale.gen &&\
locale-gen &&\
: "Set time locale, Do not use 'timedatectl set-timezone Asia/Tokyo'" &&\
ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime &&\
: "Permission fix" &&\
chmod -R 755 /etc/pacman.d &&\
pacman -Syy --noconfirm git openssh base-devel &&\
: "Add yay option" &&\
echo '[multilib]' >> /etc/pacman.conf &&\
echo 'Include = /etc/pacman.d/mirrorlist' >> /etc/pacman.conf &&\
: "Add user aur for yay install" &&\
useradd -m -r -s /bin/bash aur &&\
passwd -d aur &&\
echo 'aur ALL=(ALL) ALL' > /etc/sudoers.d/aur &&\
mkdir -p /home/aur/.gnupg &&\
echo 'standard-resolver' > /home/aur/.gnupg/dirmngr.conf &&\
chown -R aur:aur /home/aur &&\
mkdir /build &&\
chown -R aur:aur /build &&\
yes | pacman -Scc

# yay install
WORKDIR "/build"
RUN sudo -u aur git clone --depth 1 https://aur.archlinux.org/yay.git
WORKDIR "/build/yay"
RUN pacman -Syy --noconfirm base-devel &&\
sudo -u aur makepkg --noconfirm -si &&\
sudo -u aur yay --afterclean --removemake --save &&\
pacman -Qtdq | xargs -r pacman --noconfirm -Rcns &&\
: "Remove caches forcely" &&\
yes | pacman -Scc &&\
rm -rf /home/aur/.cache &&\
rm -rf /build

# My dotfiles
ARG HOME="/root"
WORKDIR "${HOME}"
ARG BRANCH="master"
ARG USER="u1and0"
RUN git clone -b ${BRANCH} --depth 1\
https://github.com/${USER}/dotfiles.git &&\
: "Replace dotfiles" &&\
mv -i "${HOME}/dotfiles/.git" "${HOME}" &&\
git reset --hard &&\
rm -rf "${HOME}/dotfiles" &&\
rmdir ${HOME}/{bacpac,pyenv}

CMD ["/bin/bash"]

LABEL maintainer="u1and0 <e01.ando60@gmail.com>"\
description="archlinux container. aur install by yay. sudo -u aur yay -S {package}"\
description.ja="Archlinux コンテナ。yayによるaurインストール可能. sudo -u aur yay -S {package}, dotfiles master branch"\
version="arlhlinux:2019.01.01"



u1and0/zplug

zplugpng


  • u1and0/archlinuxをベースにしました。

  • docker hubのビルドテストは何故か失敗していますが、ローカル環境でのビルドは成功しています。リモートのビルドが失敗する原因を調査中。

  • 別環境のWindows上のVirtualBox内のArchlinuxでdocker run u1and0/zplugで動作確認しました。


u1and0/zplug

FROM u1and0/archlinux:latest

# Reinstall packages required by zplug
RUN pacman -Syu --noconfirm zsh awk git &&\
git clone --depth 1 https://github.com/zplug/zplug ${HOME}/.zplug

# Install zplug plugins
RUN zsh -ic "source /root/.zshrc &&\
source /root/.zplug/init.zsh &&\
source /root/.zplug.zsh &&\
zplug install"

CMD ["/usr/bin/zsh"]

LABEL maintainer="u1and0 <e01.ando60@gmail.com>"\
description="zplug in archlinux"\
description.ja="zplug in archlinux"\
version="zplug v0.2.2"




u1and0/neovim

neopng


  • u1and0/archlinuxをベースにしました。

  • この記事はこのdockerイメージを使って書きました。


  • C-Jから始まるキーバインドでdenite, 例えばC-JC-Nで現在ディレクトリ下のファイル検索、C-JC-Fで現在ファイルを検索


  • F5でファイラーNERDTreeをサイドバーで開く

  • などなど


u1and0/neovim

# Neovim container

# Using my dotfiles
# Get plugins by dein
#
# Usage:
# $ docker pull u1and0/neovim
# $ docker run -it --rm -v `pwd`:/work -w /work u1and0/neovim [filename]

FROM u1and0/archlinux:latest

# Neovim install
RUN sudo -u aur yay -Syy --noconfirm python-neovim\
w3m\
pygmentize\
ctags\
global &&\
: "Remove all packages cache " &&\
yes | yay -Scc
# Plugins insall
RUN nvim -c "call dein#install()" -c "q"
# Update plguins & vimproc
RUN nvim +UpdateRemotePlugins +VimProcInstall +q

# Disable suspend keybind <C-Z>. Use docker detach keybind <C-P><C-Q> instead.
ENTRYPOINT ["/usr/bin/nvim", "-c","nn <C-Z> <nop>"]

LABEL maintainer="u1and0 <e01.ando60@gmail.com>"\
description="Neovim container. Using my dotfiles. Get plugins by dein. ctags/gtags installed."\
description.ja="neovimコンテナ。u1and0/dotfiles適用, deinによるプラグイン取得, ctags/gtags導入"\
version="neovim:v2.0.1"




u1and0/vim-go

vimgopng


  • u1and0/neovimをベースにしました。


  • fatih/vim-go, zchee/deopleteプラグインインストール済み


  • :GoInstallBinariesで手に入るツール取得済み


u1and0/vim-go

# Usage:

# docker run -it --rm -v `pwd`:/work -w /work u1and0/golang

FROM u1and0/neovim:latest

# gopath setting
ENV GOPATH="/root/go"\
PATH="$PATH:$GOPATH/bin"

# Install go
RUN pacman -Sy --noconfirm go &&\
go get\
github.com/nsf/gocode \
github.com/alecthomas/gometalinter \
golang.org/x/tools/cmd/goimports \
golang.org/x/tools/cmd/guru \
golang.org/x/tools/cmd/gorename \
github.com/golang/lint/golint \
github.com/rogpeppe/godef \
github.com/kisielk/errcheck \
github.com/jstemmer/gotags \
github.com/klauspost/asmfmt/cmd/asmfmt \
github.com/fatih/motion \
github.com/zmb3/gogetdoc \
github.com/zmb3/gogetdoc \
github.com/josharian/impl &&\
rm -rf ${GOPATH}/src/*

RUN nvim +GoInstallBinaries +q &&\
rm -rf ${GOPATH}/src/*

LABEL maintainer="u1and0 <e01.ando60@gmail.com>"\
description="my golang env with neovim"\
description.ja="自分用golang開発環境with neovim"\
version="vim-go:v1.1.0"


詳しくはページ上のREADMEで。


なぜArchlinuxか


新しいバージョンのパッケージが手に入りやすいから

pacman -S [package name] で最新版のパッケージをインストールします。

UbuntuやCentOSに落ちているパッケージは古い安定版が多いですが、Archlinux標準のパッケージマネージャpacmanを使えばより新しいバージョンを手に入れることができます。

Archlinuxはローリング・リリース

方式を取るLinuxディストロです。

pacmanデータベースが管理している最新のパッケージ同士の依存関係を解決することがOSアップデートの役割も担っています。


pacman使いたいから

上と同じ。MSYS2CmderからUNIX入門したので、パッケージマネージャーはpacman1が一番慣れているし、pacmanが一番いいパッケージマネージャだとと思ってます。(デスクトップPCはUbuntuユーザー、仮想環境はArchlinuxユーザー。)

bacpacというpacmanのバックアップツールがあり、ワンコマンドで次の機能が使えます。

* pacmanで入れたパッケージのgistへのバックアップ

* ローカルへ復元

* バックアップしたパッケージのリスト表示

* バックアップと現在インストール状況の差分表示

forkして自分で使いやすく改造していますu1and0/bacpac

bacpacの親リポジトリはメンテナンスを終了しています。


AURからもインストールできる

yay2をインストールしてあるdockerイメージをベースにしているのでyayがつかえます。

pacman -Sで見つからないパッケージはたいていyay -Sで手に入ります。

yayは AURからパッケージを落としてきます。

Ubuntuでいうapt-add-repository [reponame] && apt install [packagename]yay -S [packagename]で済ませるということですね。


実験用

上述の通りArchlinuxベースのコンテナは最新版のパッケージを手に入れやすいので、パッケージの最新機能を試してはコンテナを壊して、再構築してまた試して、という使い方を想定しています。

dockerはきれいな本番環境を作っていく目的にもいいですが、こういう実験的環境構築にも向いていると思います。

Archlinuxは上述したようなアップデート方式から「永遠の不安定版」と呼ばれているので、実機環境よりは仮想環境向きでしょう。


Powerlineフォントについて

三角形のフォントを表示するにはホストマシンにPowerline fontのインストールと「ターミナルのフォント変更作業」が必要です。

インストール方法はgithubに書かれているので従ってください。


docker開発環境を作ってみたとき気づいたメリットとデメリット


メリット


  • エラーやワーニングがでないようにdotfilesを最適化できた

  • Dockerfileが出来上がってしまえば環境の再構築がVirtualBoxよりも早い

  • Go開発の環境構築がワンコマンドですむようになった

1. git pull https://github.com/u1and0/dotfiles

2. 初回はdotfilesをホームに置き換え
3. 初回はneovimプラグインインストール
4. :GoInstallBinariesで長時間待つ

1. docker pull u1and0/vim-goで長時間待つ


デメリット


  • dotfilesが個人依存なので配布できる形で公開する意味はあるのか?dotfilesにinstallスクリプトも用意してあるし、ダブりじゃないか?

  • dotfiles更新の度にレイヤーの更新をする仕事が増えた

  • historyが残らないのがツラい。開発においては過去のコマンドも資産なので。

  • historyを残すにはホストマシンとボリューム共有してhistoryファイルをリンクするとかcommitするとか一手間必要。

  • レイヤーが重い。ディスク容量を食いつぶす。VirtualBoxでさえディスク容量食いつぶしてるのに。これは最適化の余地あり

  • ホストにもゲストにも同じバイナリ(基本的なgrepとかvimとか、/binとか/usr/bin下にあるようなやつら)があって「それってエコシステムなの?」と自問自答している