Debian stretchのベースイメージを自分で作る～EHW2018「MVPをコンテナ化①」

# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/5向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで１つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、Dockerのコンテナ用のベースイメージの作成です。

# 前提

## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> 今時コンテナじゃないとかマジ勘弁なので、hello, worldもコンテナ化しなければいけない。
> コンテナ化にあたっては、Enterpriseであるからして、ベースイメージも自分で作る必要がある。

# ベースイメージの作成

## ベースイメージとは

Dockerにおけるベースイメージとは、Dockerfileの先頭によく書いてある、

```dockerfile
FROM ImageName
```

の一行で参照されるもので、アプリをコンテナ化するときの動作環境のベースとなるものです。[Dockerfileの説明は公式サイトを参照ください](https://docs.docker.com/engine/reference/builder/#format)

## ベースファイルから作る理由

~~ネタだからです。~~
各ディストリビューション向けにDocker Hubで公式で用意されているもの以外に、自分で狙った状態（例：ディストリビューションの何かを削ったり、ユーザを準備しておいたり）の環境を作っておくことができるメリットがあります。

## 動作前提

本エントリでは、Ubuntu 18.04 LTSの環境で、"Debian GNU/Linux 9 (stretch)"を利用したベースイメージを作ります。

```shell-session
$ uname -a
Linux Ubuntu1804 4.15.0-39-generic #42-Ubuntu SMP Tue Oct 23 15:48:01 UTC 2018 x86_64 x8
$ cat /etc/os-release | grep -i version
VERSION="18.04.1 LTS (Bionic Beaver)"
VERSION_ID="18.04"
VERSION_CODENAME=bionic
```

必要なコマンドをインストールします。

### docker-ce

> （補足）"Enterprise" hello, worldなのにCommunity Editionとは何事だ、という声も聞こえますが、本シリーズではツール個人の趣味の範囲で使えるものを選んでいます。本当に企業で取り組む際には、Enterprise Editionを検討することになるでしょう。

[公式の説明](https://docs.docker.com/v17.09/engine/installation/linux/docker-ce/ubuntu/#os-requirements)に従い、もし古いdocker関係のパッケージを入れている場合には、削除します。


```shell-session
$ sudo apt-get remove docker docker-engine docker.io
```

公式サイトで用意されているインストールスクリプト「get-docker.sh」を利用して、インストールします。ラクですね。
（補足）インストールスクリプトを使わないのであれば、下記のインストール中のログと同等のコマンドを自分で入力します。

```shell-session
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
# Executing docker install script, commit: 4957679
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic edge" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sh -c docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:49:01 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:16:44 2018
  OS/Arch:          linux/amd64
  Experimental:     false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

```

本エントリ執筆時点では、18.09.0のClientとEngineがインストールされました。

### debootstrap

debootstrapをインストールします。

```shell-session
$ sudo apt install debootstrap
```

```
$ debootstrap --version
debootstrap 1.0.95ubuntu0.1
```

本エントリ執筆時点では、1.0.95ubuntu0.1がインストールされました。


## debootstrapを使う

基本的に、[debootstrapのマニュアルページ](http://manpages.ubuntu.com/manpages/cosmic/en/man8/debootstrap.8.html)に書いてあるままです。

### 準備

```
$ mkdir jessy-chroot
```

Debian stretchのイメージを取得します。回線の種類によりますが、数分かかります。

```
$ sudo debootstrap stretch ./stretch-chroot http://deb.debian.org/debian
```

何らかの理由でインターネットとの深い断絶があっても使えるようです。

```
$ debootstrap stretch ./stretch-chroot file:///LOCAL_MIRROR/debian
```

<details><summary>debootstrapの動作の様子はこちらを展開（いっぱいログが出ます）</summary><div>

```shell

I: Retrieving InRelease
I: Retrieving Release
I: Retrieving Release.gpg
I: Checking Release signature
I: Valid Release signature (key id 067E3C456BAE240ACEE88F6FEF0F382A1A7B6500)
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional required dependencies: libaudit-common libaudit1 libbz2-1.0 libcap-ng0 libdb5.3 libdebconfclient0 libgcrypt20 libgpg-error0 liblz4-1 libncursesw5 libsemanage-common libsemanage1 libsystemd0 libudev1 libustr-1.0-1
I: Found additional base dependencies: dmsetup gnupg-agent libapparmor1 libassuan0 libbsd0 libcap2 libcryptsetup4 libdevmapper1.02.1 libdns-export162 libelf1 libfastjson4 libffi6 libgmp10 libgnutls30 libhogweed4 libidn11 libidn2-0 libip4tc0 libip6tc0 libiptc0 libisc-export160 libksba8 liblocale-gettext-perl liblognorm5 libmnl0 libncurses5 libnetfilter-conntrack3 libnettle6 libnfnetlink0 libnpth0 libp11-kit0 libpsl5 libseccomp2 libsqlite3-0 libtasn1-6 libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libunistring0 libxtables12 pinentry-curses xxd
I: Checking component main on http://deb.debian.org/debian...
I: Retrieving libacl1 2.2.52-3+b1
I: Validating libacl1 2.2.52-3+b1
I: Retrieving adduser 3.115
I: Validating adduser 3.115
I: Retrieving libapparmor1 2.11.0-3+deb9u2
I: Validating libapparmor1 2.11.0-3+deb9u2
I: Retrieving apt 1.4.8
I: Validating apt 1.4.8
I: Retrieving apt-utils 1.4.8
I: Validating apt-utils 1.4.8
I: Retrieving libapt-inst2.0 1.4.8
I: Validating libapt-inst2.0 1.4.8
I: Retrieving libapt-pkg5.0 1.4.8
I: Validating libapt-pkg5.0 1.4.8
I: Retrieving libattr1 1:2.4.47-2+b2
I: Validating libattr1 1:2.4.47-2+b2
I: Retrieving libaudit-common 1:2.6.7-2
I: Validating libaudit-common 1:2.6.7-2
I: Retrieving libaudit1 1:2.6.7-2
I: Validating libaudit1 1:2.6.7-2
I: Retrieving base-files 9.9+deb9u6
I: Validating base-files 9.9+deb9u6
I: Retrieving base-passwd 3.5.43
I: Validating base-passwd 3.5.43
I: Retrieving bash 4.4-5
I: Validating bash 4.4-5
I: Retrieving libdns-export162 1:9.10.3.dfsg.P4-12.3+deb9u4
I: Validating libdns-export162 1:9.10.3.dfsg.P4-12.3+deb9u4
I: Retrieving libisc-export160 1:9.10.3.dfsg.P4-12.3+deb9u4
I: Validating libisc-export160 1:9.10.3.dfsg.P4-12.3+deb9u4
I: Retrieving bsdmainutils 9.0.12+nmu1
I: Validating bsdmainutils 9.0.12+nmu1
I: Retrieving libbz2-1.0 1.0.6-8.1
I: Validating libbz2-1.0 1.0.6-8.1
I: Retrieving libdebconfclient0 0.227
I: Validating libdebconfclient0 0.227
I: Retrieving coreutils 8.26-3
I: Validating coreutils 8.26-3
I: Retrieving cpio 2.11+dfsg-6
I: Validating cpio 2.11+dfsg-6
I: Retrieving cron 3.0pl1-128+deb9u1
I: Validating cron 3.0pl1-128+deb9u1
I: Retrieving libcryptsetup4 2:1.7.3-4
I: Validating libcryptsetup4 2:1.7.3-4
I: Retrieving dash 0.5.8-2.4
I: Validating dash 0.5.8-2.4
I: Retrieving libdb5.3 5.3.28-12+deb9u1
I: Validating libdb5.3 5.3.28-12+deb9u1
I: Retrieving debconf 1.5.61
I: Validating debconf 1.5.61
I: Retrieving debconf-i18n 1.5.61
I: Validating debconf-i18n 1.5.61
I: Retrieving debian-archive-keyring 2017.5
I: Validating debian-archive-keyring 2017.5
I: Retrieving debianutils 4.8.1.1
I: Validating debianutils 4.8.1.1
I: Retrieving diffutils 1:3.5-3
I: Validating diffutils 1:3.5-3
I: Retrieving dmidecode 3.0-4
I: Validating dmidecode 3.0-4
I: Retrieving dpkg 1.18.25
I: Validating dpkg 1.18.25
I: Retrieving e2fslibs 1.43.4-2
I: Validating e2fslibs 1.43.4-2
I: Retrieving e2fsprogs 1.43.4-2
I: Validating e2fsprogs 1.43.4-2
I: Retrieving libcomerr2 1.43.4-2
I: Validating libcomerr2 1.43.4-2
I: Retrieving libss2 1.43.4-2
I: Validating libss2 1.43.4-2
I: Retrieving libelf1 0.168-1
I: Validating libelf1 0.168-1
I: Retrieving findutils 4.6.0+git+20161106-2
I: Validating findutils 4.6.0+git+20161106-2
I: Retrieving gcc-6-base 6.3.0-18+deb9u1
I: Validating gcc-6-base 6.3.0-18+deb9u1
I: Retrieving libgcc1 1:6.3.0-18+deb9u1
I: Validating libgcc1 1:6.3.0-18+deb9u1
I: Retrieving libstdc++6 6.3.0-18+deb9u1
I: Validating libstdc++6 6.3.0-18+deb9u1
I: Retrieving libgdbm3 1.8.3-14
I: Validating libgdbm3 1.8.3-14
I: Retrieving libc-bin 2.24-11+deb9u3
I: Validating libc-bin 2.24-11+deb9u3
I: Retrieving libc6 2.24-11+deb9u3
I: Validating libc6 2.24-11+deb9u3
I: Retrieving multiarch-support 2.24-11+deb9u3
I: Validating multiarch-support 2.24-11+deb9u3
I: Retrieving libgmp10 2:6.1.2+dfsg-1
I: Validating libgmp10 2:6.1.2+dfsg-1
I: Retrieving gnupg 2.1.18-8~deb9u3
I: Validating gnupg 2.1.18-8~deb9u3
I: Retrieving gnupg-agent 2.1.18-8~deb9u3
I: Validating gnupg-agent 2.1.18-8~deb9u3
I: Retrieving gpgv 2.1.18-8~deb9u3
I: Validating gpgv 2.1.18-8~deb9u3
I: Retrieving libgnutls30 3.5.8-5+deb9u4
I: Validating libgnutls30 3.5.8-5+deb9u4
I: Retrieving grep 2.27-2
I: Validating grep 2.27-2
I: Retrieving gzip 1.6-5+b1
I: Validating gzip 1.6-5+b1
I: Retrieving hostname 3.18+b1
I: Validating hostname 3.18+b1
I: Retrieving ifupdown 0.8.19
I: Validating ifupdown 0.8.19
I: Retrieving init 1.48
I: Validating init 1.48
I: Retrieving init-system-helpers 1.48
I: Validating init-system-helpers 1.48
I: Retrieving iproute2 4.9.0-1+deb9u1
I: Validating iproute2 4.9.0-1+deb9u1
I: Retrieving iptables 1.6.0+snapshot20161117-6
I: Validating iptables 1.6.0+snapshot20161117-6
I: Retrieving libip4tc0 1.6.0+snapshot20161117-6
I: Validating libip4tc0 1.6.0+snapshot20161117-6
I: Retrieving libip6tc0 1.6.0+snapshot20161117-6
I: Validating libip6tc0 1.6.0+snapshot20161117-6
I: Retrieving libiptc0 1.6.0+snapshot20161117-6
I: Validating libiptc0 1.6.0+snapshot20161117-6
I: Retrieving libxtables12 1.6.0+snapshot20161117-6
I: Validating libxtables12 1.6.0+snapshot20161117-6
I: Retrieving iputils-ping 3:20161105-1
I: Validating iputils-ping 3:20161105-1
I: Retrieving isc-dhcp-client 4.3.5-3+deb9u1
I: Validating isc-dhcp-client 4.3.5-3+deb9u1
I: Retrieving isc-dhcp-common 4.3.5-3+deb9u1
I: Validating isc-dhcp-common 4.3.5-3+deb9u1
I: Retrieving kmod 23-2
I: Validating kmod 23-2
I: Retrieving libkmod2 23-2
I: Validating libkmod2 23-2
I: Retrieving libassuan0 2.4.3-2
I: Validating libassuan0 2.4.3-2
I: Retrieving libbsd0 0.8.3-1
I: Validating libbsd0 0.8.3-1
I: Retrieving libcap-ng0 0.7.7-3+b1
I: Validating libcap-ng0 0.7.7-3+b1
I: Retrieving libcap2 1:2.25-1
I: Validating libcap2 1:2.25-1
I: Retrieving libestr0 0.1.10-2
I: Validating libestr0 0.1.10-2
I: Retrieving libfastjson4 0.99.4-1
I: Validating libfastjson4 0.99.4-1
I: Retrieving libffi6 3.2.1-6
I: Validating libffi6 3.2.1-6
I: Retrieving libgcrypt20 1.7.6-2+deb9u3
I: Validating libgcrypt20 1.7.6-2+deb9u3
I: Retrieving libgpg-error0 1.26-2
I: Validating libgpg-error0 1.26-2
I: Retrieving libidn11 1.33-1
I: Validating libidn11 1.33-1
I: Retrieving libidn2-0 0.16-1+deb9u1
I: Validating libidn2-0 0.16-1+deb9u1
I: Retrieving libksba8 1.3.5-2
I: Validating libksba8 1.3.5-2
I: Retrieving liblocale-gettext-perl 1.07-3+b1
I: Validating liblocale-gettext-perl 1.07-3+b1
I: Retrieving liblogging-stdlog0 1.0.5-2+b2
I: Validating liblogging-stdlog0 1.0.5-2+b2
I: Retrieving liblognorm5 2.0.1-1.1+b1
I: Validating liblognorm5 2.0.1-1.1+b1
I: Retrieving libmnl0 1.0.4-2
I: Validating libmnl0 1.0.4-2
I: Retrieving libnetfilter-conntrack3 1.0.6-2
I: Validating libnetfilter-conntrack3 1.0.6-2
I: Retrieving libnfnetlink0 1.0.1-3
I: Validating libnfnetlink0 1.0.1-3
I: Retrieving libpipeline1 1.4.1-2
I: Validating libpipeline1 1.4.1-2
I: Retrieving libpsl5 0.17.0-3
I: Validating libpsl5 0.17.0-3
I: Retrieving libseccomp2 2.3.1-2.1+deb9u1
I: Validating libseccomp2 2.3.1-2.1+deb9u1
I: Retrieving libselinux1 2.6-3+b3
I: Validating libselinux1 2.6-3+b3
I: Retrieving libsemanage-common 2.6-2
I: Validating libsemanage-common 2.6-2
I: Retrieving libsemanage1 2.6-2
I: Validating libsemanage1 2.6-2
I: Retrieving libsepol1 2.6-2
I: Validating libsepol1 2.6-2
I: Retrieving libtasn1-6 4.10-1.1+deb9u1
I: Validating libtasn1-6 4.10-1.1+deb9u1
I: Retrieving libtext-charwidth-perl 0.04-7+b5
I: Validating libtext-charwidth-perl 0.04-7+b5
I: Retrieving libtext-iconv-perl 1.7-5+b4
I: Validating libtext-iconv-perl 1.7-5+b4
I: Retrieving libtext-wrapi18n-perl 0.06-7.1
I: Validating libtext-wrapi18n-perl 0.06-7.1
I: Retrieving libunistring0 0.9.6+really0.9.3-0.1
I: Validating libunistring0 0.9.6+really0.9.3-0.1
I: Retrieving logrotate 3.11.0-0.1
I: Validating logrotate 3.11.0-0.1
I: Retrieving lsb-base 9.20161125
I: Validating lsb-base 9.20161125
I: Retrieving dmsetup 2:1.02.137-2
I: Validating dmsetup 2:1.02.137-2
I: Retrieving libdevmapper1.02.1 2:1.02.137-2
I: Validating libdevmapper1.02.1 2:1.02.137-2
I: Retrieving liblz4-1 0.0~r131-2+b1
I: Validating liblz4-1 0.0~r131-2+b1
I: Retrieving mawk 1.3.3-17+b3
I: Validating mawk 1.3.3-17+b3
I: Retrieving nano 2.7.4-1
I: Validating nano 2.7.4-1
I: Retrieving libncurses5 6.0+20161126-1+deb9u2
I: Validating libncurses5 6.0+20161126-1+deb9u2
I: Retrieving libncursesw5 6.0+20161126-1+deb9u2
I: Validating libncursesw5 6.0+20161126-1+deb9u2
I: Retrieving libtinfo5 6.0+20161126-1+deb9u2
I: Validating libtinfo5 6.0+20161126-1+deb9u2
I: Retrieving ncurses-base 6.0+20161126-1+deb9u2
I: Validating ncurses-base 6.0+20161126-1+deb9u2
I: Retrieving ncurses-bin 6.0+20161126-1+deb9u2
I: Validating ncurses-bin 6.0+20161126-1+deb9u2
I: Retrieving netbase 5.4
I: Validating netbase 5.4
I: Retrieving libhogweed4 3.3-1+b2
I: Validating libhogweed4 3.3-1+b2
I: Retrieving libnettle6 3.3-1+b2
I: Validating libnettle6 3.3-1+b2
I: Retrieving libnewt0.52 0.52.19-1+b1
I: Validating libnewt0.52 0.52.19-1+b1
I: Retrieving whiptail 0.52.19-1+b1
I: Validating whiptail 0.52.19-1+b1
I: Retrieving libnpth0 1.3-1
I: Validating libnpth0 1.3-1
I: Retrieving libssl1.1 1.1.0f-3+deb9u2
I: Validating libssl1.1 1.1.0f-3+deb9u2
I: Retrieving libssl1.0.2 1.0.2l-2+deb9u3
I: Validating libssl1.0.2 1.0.2l-2+deb9u3
I: Retrieving libp11-kit0 0.23.3-2
I: Validating libp11-kit0 0.23.3-2
I: Retrieving libpam-modules 1.1.8-3.6
I: Validating libpam-modules 1.1.8-3.6
I: Retrieving libpam-modules-bin 1.1.8-3.6
I: Validating libpam-modules-bin 1.1.8-3.6
I: Retrieving libpam-runtime 1.1.8-3.6
I: Validating libpam-runtime 1.1.8-3.6
I: Retrieving libpam0g 1.1.8-3.6
I: Validating libpam0g 1.1.8-3.6
I: Retrieving libpcre3 2:8.39-3
I: Validating libpcre3 2:8.39-3
I: Retrieving perl-base 5.24.1-3+deb9u4
I: Validating perl-base 5.24.1-3+deb9u4
I: Retrieving pinentry-curses 1.0.0-2
^[[DI: Validating pinentry-curses 1.0.0-2
I: Retrieving libpopt0 1.16-10+b2
^[[A^[[C^[[B^[[DI: Validating libpopt0 1.16-10+b2
I: Retrieving libprocps6 2:3.3.12-3+deb9u1
I: Validating libprocps6 2:3.3.12-3+deb9u1
I: Retrieving procps 2:3.3.12-3+deb9u1
I: Validating procps 2:3.3.12-3+deb9u1
I: Retrieving libreadline7 7.0-3
I: Validating libreadline7 7.0-3
I: Retrieving readline-common 7.0-3
I: Validating readline-common 7.0-3
I: Retrieving rsyslog 8.24.0-1
I: Validating rsyslog 8.24.0-1
I: Retrieving sed 4.4-1
I: Validating sed 4.4-1
I: Retrieving sensible-utils 0.0.9+deb9u1
I: Validating sensible-utils 0.0.9+deb9u1
I: Retrieving login 1:4.4-4.1
I: Validating login 1:4.4-4.1
I: Retrieving passwd 1:4.4-4.1
I: Validating passwd 1:4.4-4.1
I: Retrieving libslang2 2.3.1-5
I: Validating libslang2 2.3.1-5
I: Retrieving libsqlite3-0 3.16.2-5+deb9u1
I: Validating libsqlite3-0 3.16.2-5+deb9u1
I: Retrieving libsystemd0 232-25+deb9u6
I: Validating libsystemd0 232-25+deb9u6
I: Retrieving libudev1 232-25+deb9u6
I: Validating libudev1 232-25+deb9u6
I: Retrieving systemd 232-25+deb9u6
I: Validating systemd 232-25+deb9u6
I: Retrieving systemd-sysv 232-25+deb9u6
I: Validating systemd-sysv 232-25+deb9u6
I: Retrieving udev 232-25+deb9u6
I: Validating udev 232-25+deb9u6
I: Retrieving sysvinit-utils 2.88dsf-59.9
I: Validating sysvinit-utils 2.88dsf-59.9
I: Retrieving tar 1.29b-1.1
I: Validating tar 1.29b-1.1
I: Retrieving tasksel 3.39
I: Validating tasksel 3.39
I: Retrieving tasksel-data 3.39
I: Validating tasksel-data 3.39
I: Retrieving tzdata 2018g-0+deb9u1
I: Validating tzdata 2018g-0+deb9u1
I: Retrieving libustr-1.0-1 1.0.4-6
I: Validating libustr-1.0-1 1.0.4-6
I: Retrieving bsdutils 1:2.29.2-1+deb9u1
I: Validating bsdutils 1:2.29.2-1+deb9u1
I: Retrieving libblkid1 2.29.2-1+deb9u1
I: Validating libblkid1 2.29.2-1+deb9u1
I: Retrieving libfdisk1 2.29.2-1+deb9u1
I: Validating libfdisk1 2.29.2-1+deb9u1
I: Retrieving libmount1 2.29.2-1+deb9u1
I: Validating libmount1 2.29.2-1+deb9u1
I: Retrieving libsmartcols1 2.29.2-1+deb9u1
I: Validating libsmartcols1 2.29.2-1+deb9u1
I: Retrieving libuuid1 2.29.2-1+deb9u1
I: Validating libuuid1 2.29.2-1+deb9u1
I: Retrieving mount 2.29.2-1+deb9u1
I: Validating mount 2.29.2-1+deb9u1
I: Retrieving util-linux 2.29.2-1+deb9u1
I: Validating util-linux 2.29.2-1+deb9u1
I: Retrieving vim-common 2:8.0.0197-4+deb9u1
I: Validating vim-common 2:8.0.0197-4+deb9u1
I: Retrieving vim-tiny 2:8.0.0197-4+deb9u1
I: Validating vim-tiny 2:8.0.0197-4+deb9u1
I: Retrieving xxd 2:8.0.0197-4+deb9u1
I: Validating xxd 2:8.0.0197-4+deb9u1
I: Retrieving wget 1.18-5+deb9u2
I: Validating wget 1.18-5+deb9u2
I: Retrieving libxapian30 1.4.3-2+deb9u2
I: Validating libxapian30 1.4.3-2+deb9u2
I: Retrieving liblzma5 5.2.2-1.2+b1
I: Validating liblzma5 5.2.2-1.2+b1
I: Retrieving zlib1g 1:1.2.8.dfsg-5
I: Validating zlib1g 1:1.2.8.dfsg-5
I: Chosen extractor for .deb packages: dpkg-deb
I: Extracting libacl1...
I: Extracting libattr1...
I: Extracting libaudit-common...
I: Extracting libaudit1...
I: Extracting base-files...
I: Extracting base-passwd...
I: Extracting bash...
I: Extracting libbz2-1.0...
I: Extracting libdebconfclient0...
I: Extracting coreutils...
I: Extracting dash...
I: Extracting libdb5.3...
I: Extracting debconf...
I: Extracting debianutils...
I: Extracting diffutils...
I: Extracting dpkg...
I: Extracting e2fslibs...
I: Extracting e2fsprogs...
I: Extracting libcomerr2...
I: Extracting libss2...
I: Extracting findutils...
I: Extracting gcc-6-base...
I: Extracting libgcc1...
I: Extracting libc-bin...
I: Extracting libc6...
I: Extracting multiarch-support...
I: Extracting grep...
I: Extracting gzip...
I: Extracting hostname...
I: Extracting init-system-helpers...
I: Extracting libcap-ng0...
I: Extracting libgcrypt20...
I: Extracting libgpg-error0...
I: Extracting libselinux1...
I: Extracting libsemanage-common...
I: Extracting libsemanage1...
I: Extracting libsepol1...
I: Extracting lsb-base...
I: Extracting liblz4-1...
I: Extracting mawk...
I: Extracting libncursesw5...
I: Extracting libtinfo5...
I: Extracting ncurses-base...
I: Extracting ncurses-bin...
I: Extracting libpam-modules...
I: Extracting libpam-modules-bin...
I: Extracting libpam-runtime...
I: Extracting libpam0g...
I: Extracting libpcre3...
I: Extracting perl-base...
I: Extracting sed...
I: Extracting sensible-utils...
I: Extracting login...
I: Extracting passwd...
I: Extracting libsystemd0...
I: Extracting libudev1...
I: Extracting sysvinit-utils...
I: Extracting tar...
I: Extracting tzdata...
I: Extracting libustr-1.0-1...
I: Extracting bsdutils...
I: Extracting libblkid1...
I: Extracting libfdisk1...
I: Extracting libmount1...
I: Extracting libsmartcols1...
I: Extracting libuuid1...
I: Extracting mount...
I: Extracting util-linux...
I: Extracting liblzma5...
I: Extracting zlib1g...
I: Installing core packages...
I: Unpacking required packages...
I: Unpacking libacl1:amd64...
I: Unpacking libattr1:amd64...
I: Unpacking libaudit-common...
I: Unpacking libaudit1:amd64...
I: Unpacking base-files...
I: Unpacking base-passwd...
I: Unpacking bash...
I: Unpacking libbz2-1.0:amd64...
I: Unpacking libdebconfclient0:amd64...
I: Unpacking coreutils...
I: Unpacking dash...
I: Unpacking libdb5.3:amd64...
I: Unpacking debconf...
I: Unpacking debianutils...
I: Unpacking diffutils...
I: Unpacking dpkg...
I: Unpacking e2fslibs:amd64...
I: Unpacking e2fsprogs...
I: Unpacking libcomerr2:amd64...
I: Unpacking libss2:amd64...
I: Unpacking findutils...
I: Unpacking gcc-6-base:amd64...
I: Unpacking libgcc1:amd64...
I: Unpacking libc-bin...
I: Unpacking libc6:amd64...
I: Unpacking multiarch-support...
I: Unpacking grep...
I: Unpacking gzip...
I: Unpacking hostname...
I: Unpacking init-system-helpers...
I: Unpacking libcap-ng0:amd64...
I: Unpacking libgcrypt20:amd64...
I: Unpacking libgpg-error0:amd64...
I: Unpacking libselinux1:amd64...
I: Unpacking libsemanage-common...
I: Unpacking libsemanage1:amd64...
I: Unpacking libsepol1:amd64...
I: Unpacking lsb-base...
I: Unpacking liblz4-1:amd64...
I: Unpacking mawk...
I: Unpacking libncursesw5:amd64...
I: Unpacking libtinfo5:amd64...
I: Unpacking ncurses-base...
I: Unpacking ncurses-bin...
I: Unpacking libpam-modules:amd64...
I: Unpacking libpam-modules-bin...
I: Unpacking libpam-runtime...
I: Unpacking libpam0g:amd64...
I: Unpacking libpcre3:amd64...
I: Unpacking perl-base...
I: Unpacking sed...
I: Unpacking sensible-utils...
I: Unpacking login...
I: Unpacking passwd...
I: Unpacking libsystemd0:amd64...
I: Unpacking libudev1:amd64...
I: Unpacking sysvinit-utils...
I: Unpacking tar...
I: Unpacking tzdata...
I: Unpacking libustr-1.0-1:amd64...
I: Unpacking bsdutils...
I: Unpacking libblkid1:amd64...
I: Unpacking libfdisk1:amd64...
I: Unpacking libmount1:amd64...
I: Unpacking libsmartcols1:amd64...
I: Unpacking libuuid1:amd64...
I: Unpacking mount...
I: Unpacking util-linux...
I: Unpacking liblzma5:amd64...
I: Unpacking zlib1g:amd64...
I: Configuring required packages...
I: Configuring gcc-6-base:amd64...
I: Configuring lsb-base...
I: Configuring sensible-utils...
I: Configuring ncurses-base...
I: Configuring libsemanage-common...
I: Configuring libaudit-common...
I: Configuring libc6:amd64...
I: Configuring libbz2-1.0:amd64...
I: Configuring libgpg-error0:amd64...
I: Configuring libc-bin...
I: Configuring libdebconfclient0:amd64...
I: Configuring diffutils...
I: Configuring libcomerr2:amd64...
I: Configuring libcap-ng0:amd64...
I: Configuring libsepol1:amd64...
I: Configuring libgcc1:amd64...
I: Configuring libustr-1.0-1:amd64...
I: Configuring libsmartcols1:amd64...
I: Configuring libaudit1:amd64...
I: Configuring libtinfo5:amd64...
I: Configuring libudev1:amd64...
I: Configuring libattr1:amd64...
I: Configuring libss2:amd64...
I: Configuring liblzma5:amd64...
I: Configuring base-passwd...
I: Configuring e2fslibs:amd64...
I: Configuring liblz4-1:amd64...
I: Configuring debianutils...
I: Configuring libgcrypt20:amd64...
I: Configuring libncursesw5:amd64...
I: Configuring libdb5.3:amd64...
I: Configuring zlib1g:amd64...
I: Configuring hostname...
I: Configuring multiarch-support...
I: Configuring mawk...
I: Configuring libpcre3:amd64...
I: Configuring base-files...
I: Configuring libselinux1:amd64...
I: Configuring findutils...
I: Configuring libacl1:amd64...
I: Configuring ncurses-bin...
I: Configuring sed...
I: Configuring libsystemd0:amd64...
I: Configuring coreutils...
I: Configuring tar...
I: Configuring libsemanage1:amd64...
I: Configuring dpkg...
I: Configuring perl-base...
I: Configuring grep...
I: Configuring debconf...
I: Configuring tzdata...
I: Configuring gzip...
I: Configuring bsdutils...
I: Configuring dash...
I: Configuring init-system-helpers...
I: Configuring libpam0g:amd64...
I: Configuring libpam-modules-bin...
I: Configuring bash...
I: Configuring libpam-modules:amd64...
I: Configuring libpam-runtime...
I: Configuring passwd...
I: Configuring login...
I: Configuring libuuid1:amd64...
I: Configuring libblkid1:amd64...
I: Configuring libmount1:amd64...
I: Configuring mount...
I: Configuring libfdisk1:amd64...
I: Configuring util-linux...
I: Configuring e2fsprogs...
I: Configuring sysvinit-utils...
I: Configuring libc-bin...
I: Unpacking the base system...
I: Unpacking apt...
I: Unpacking apt-utils...
I: Unpacking libapt-inst2.0:amd64...
I: Unpacking libapt-pkg5.0:amd64...
I: Unpacking libdns-export162...
I: Unpacking libisc-export160...
I: Unpacking bsdmainutils...
I: Unpacking cpio...
I: Unpacking cron...
I: Unpacking debconf-i18n...
I: Unpacking debian-archive-keyring...
I: Unpacking dmidecode...
I: Unpacking libelf1:amd64...
I: Unpacking libstdc++6:amd64...
I: Unpacking libgdbm3:amd64...
I: Unpacking libgmp10:amd64...
I: Unpacking gnupg...
I: Unpacking gnupg-agent...
I: Unpacking gpgv...
I: Unpacking libgnutls30:amd64...
I: Unpacking ifupdown...
I: Unpacking init...
I: Unpacking iproute2...
I: Unpacking iptables...
I: Unpacking libip6tc0:amd64...
I: Unpacking libiptc0:amd64...
I: Unpacking libxtables12:amd64...
I: Unpacking iputils-ping...
I: Unpacking isc-dhcp-client...
I: Unpacking isc-dhcp-common...
I: Unpacking kmod...
I: Unpacking libassuan0:amd64...
I: Unpacking libbsd0:amd64...
I: Unpacking libestr0...
I: Unpacking libfastjson4:amd64...
I: Unpacking libffi6:amd64...
I: Unpacking libidn2-0:amd64...
I: Unpacking libksba8:amd64...
I: Unpacking liblocale-gettext-perl...
I: Unpacking liblogging-stdlog0:amd64...
I: Unpacking liblognorm5:amd64...
I: Unpacking libmnl0:amd64...
I: Unpacking libnetfilter-conntrack3:amd64...
I: Unpacking libnfnetlink0:amd64...
I: Unpacking libpipeline1:amd64...
I: Unpacking libpsl5:amd64...
I: Unpacking libtasn1-6:amd64...
I: Unpacking libtext-charwidth-perl...
I: Unpacking libtext-iconv-perl...
I: Unpacking libtext-wrapi18n-perl...
I: Unpacking libunistring0:amd64...
I: Unpacking logrotate...
I: Unpacking nano...
I: Unpacking netbase...
I: Unpacking libhogweed4:amd64...
I: Unpacking libnettle6:amd64...
I: Unpacking libnewt0.52:amd64...
I: Unpacking whiptail...
I: Unpacking libnpth0:amd64...
I: Unpacking libssl1.1:amd64...
I: Unpacking libssl1.0.2:amd64...
I: Unpacking libp11-kit0:amd64...
I: Unpacking pinentry-curses...
I: Unpacking libpopt0:amd64...
I: Unpacking libreadline7:amd64...
I: Unpacking readline-common...
I: Unpacking rsyslog...
I: Unpacking libslang2:amd64...
I: Unpacking libsqlite3-0:amd64...
I: Unpacking udev...
I: Unpacking tasksel...
I: Unpacking tasksel-data...
I: Unpacking vim-common...
I: Unpacking vim-tiny...
I: Unpacking xxd...
I: Unpacking wget...
I: Unpacking libxapian30:amd64...
I: Configuring the base system...
I: Configuring libnpth0:amd64...
I: Configuring readline-common...
I: Configuring libgdbm3:amd64...
I: Configuring libnettle6:amd64...
I: Configuring cpio...
I: Configuring libpopt0:amd64...
I: Configuring kmod...
I: Configuring libestr0...
I: Configuring libisc-export160...
I: Configuring xxd...
I: Configuring libfastjson4:amd64...
I: Configuring isc-dhcp-common...
I: Configuring dmidecode...
I: Configuring libreadline7:amd64...
I: Configuring init...
I: Configuring libelf1:amd64...
I: Configuring gpgv...
I: Configuring liblogging-stdlog0:amd64...
I: Configuring libpipeline1:amd64...
I: Configuring libksba8:amd64...
I: Configuring libbsd0:amd64...
I: Configuring liblognorm5:amd64...
I: Configuring libtasn1-6:amd64...
I: Configuring libssl1.0.2:amd64...
I: Configuring nano...
I: Configuring libgmp10:amd64...
I: Configuring libxtables12:amd64...
I: Configuring udev...
I: Configuring libunistring0:amd64...
I: Configuring libssl1.1:amd64...
I: Configuring debian-archive-keyring...
I: Configuring libtext-iconv-perl...
I: Configuring vim-common...
I: Configuring libsqlite3-0:amd64...
I: Configuring liblocale-gettext-perl...
I: Configuring libnfnetlink0:amd64...
I: Configuring libstdc++6:amd64...
I: Configuring libffi6:amd64...
I: Configuring libtext-charwidth-perl...
I: Configuring bsdmainutils...
I: Configuring libslang2:amd64...
I: Configuring cron...
I: Configuring libmnl0:amd64...
I: Configuring libassuan0:amd64...
I: Configuring logrotate...
I: Configuring rsyslog...
I: Configuring libip6tc0:amd64...
I: Configuring netbase...
I: Configuring iputils-ping...
I: Configuring vim-tiny...
I: Configuring libapt-pkg5.0:amd64...
I: Configuring libapt-inst2.0:amd64...
I: Configuring libxapian30:amd64...
I: Configuring libidn2-0:amd64...
I: Configuring libnetfilter-conntrack3:amd64...
I: Configuring libpsl5:amd64...
I: Configuring libdns-export162...
I: Configuring libiptc0:amd64...
I: Configuring iproute2...
I: Configuring isc-dhcp-client...
I: Configuring libhogweed4:amd64...
I: Configuring iptables...
I: Configuring libtext-wrapi18n-perl...
I: Configuring libp11-kit0:amd64...
I: Configuring apt...
I: Configuring pinentry-curses...
I: Configuring libnewt0.52:amd64...
I: Configuring gnupg-agent...
I: Configuring ifupdown...
I: Configuring apt-utils...
I: Configuring debconf-i18n...
I: Configuring whiptail...
I: Configuring gnupg...
I: Configuring libgnutls30:amd64...
I: Configuring wget...
I: Configuring tasksel...
I: Configuring tasksel-data...
I: Configuring libc-bin...
I: Configuring systemd...
I: Base system installed successfully.
\```
</div></details>

出来上がったディレクトリのサイズは、269Mでした。

```shell
$ sudo du -h stretch-chroot | tail -1
269M    stretch-chroot
````

### 中を覗いてみる

chrootコマンドで、出来上がったディレクトリの中でbashを実行して中を覗いてみます。

```
$ sudo chroot stretch-chroot /bin/bash
# cat /etc/debian_version
9.6
♯ exit
```

イメージに対して何か仕込んでおきたい場合、上記のchroot内で作業します。

### dockerコンテナ化

以下、dockerコマンドを使ってコンテナを作ります。

> (補足)このエントリでは、一般ユーザをdockerグループに追加していない状態で書いているため、dockerコマンドをsudo経由で使っています。この手間を省くにはdockerに一般ユーザを追加するなどすればよいです。必要に応じて別エントリにて取り上げます。

```
$ sudo tar -c . | sudo docker import - debian-stretch
sha256:c59c0c11fdb6d050e387b4c6b19220d2f4efd7d8092a2106e0ad3e2d6adcf532
```

イメージが出来上がっていることを「docker images」で確認します。
```
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
debian-stretch      latest              c59c0c11fdb6        About a minute ago   258MB
```

### 出来上がったコンテナを動かしてみる

コンテナ内でコマンドを動かし、利用したイメージのバージョンを確認します。

```shell
$ sudo docker run -it debian-stretch cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

Debian GNU/Linux 9 (stretch)なコンテナができました。

# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の5日目として、Dockerのコンテナ用のベースイメージの作成をトピックとして取り上げました。

EHW2018のネタとしては、このあと、このコンテナにDay4で作ったアプリを入れたあと、なるべくめんどくさく周辺環境を実現していくことを考えています。