Docker(Podman) 向け base image を自作する

ISO だけしかなくて、インターネットにつながっていない環境はよくあるはずなので。
CentOS7 の base image を自作する手順。
Docker はインストール済み。ISO は /tmp/iso に mount 済みの前提

# yum 用の定義作成
以下内容で、yum 用の定義を作る

``` base.repo
[main]
gpgcheck=0

[base]
name=CentOS-7 - Base
baseurl=file:///tmp/iso
```

name とか baseurl とかは環境に合わせて読み替える

# ベース作成

```
$ mkdir /tmp/base_centos7 <-- ベースインストール先
$ sudo yum -c /tmp/base.repo --disablerepo="*" --enablerepo="base" --installroot=/tmp/base_centos7 -y groupinstall Core
```

# デバイスファイル作成

```
cd /tmp/base_centos7/dev
sudo mknod -m 666 null c 1 3
sudo mknod -m 666 zero c 1 5
sudo mknod -m 666 random c 1 8
sudo mknod -m 666 urandom c 1 9
sudo mkdir -m 755 pts
sudo mkdir -m 1777 shm
sudo mknod -m 666 tty c 5 0
sudo mknod -m 666 tty0 c 4 0
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
sudo mknod -m 600 console c 5 1
sudo mknod -m 666 full c 1 7
sudo mknod -m 600 initctl p
sudo mknod -m 666 ptmx c 5 2
```

# 確認
```
sudo chrooot /tmp/base_centos7 /bin/bash
```

# お好みで
- base image としてインストールしておきたいパッケージなどのインストール

## selinux の無効化
```
sudo /tmp/base_centos7 /bin/bash
vi /etc/selinux/config
⇒ SELINUX=disabled に書き換え
```
# docker に base image の登録
```
cd /tmp/base_centos7
sudo tar -c . | docker import - centos7
```

# 不要サービスの停止
このままだといらないサービスが起動するので、サービスの無効化をする

systemd を使えるようにコンテナ起動して、コンテナに入る

```
docker run -d --privileged centos7 /sbin/init
docker exec -it [コンテナ ID] /bin/bash
```

最初はこんな感じ

``` 
# systemctl status
● 313ee2ca2439
    State: degraded
     Jobs: 0 queued
   Failed: 4 units
    Since: Sun 2019-09-01 03:03:58 UTC; 27s ago
   CGroup: /system.slice/docker-313ee2ca2439975895f9a51edaf67235c240f2e106b53764c2d67cbf7dba6f1e.scope
           |-    1 /sbin/init
           |-1987 /bin/bash
           |-2044 systemctl status
           |-2045 systemctl status
           --system.slice
             |-systemd-udevd.service
             | -33 /usr/lib/systemd/systemd-udevd
             |-polkit.service
             | -234 /usr/lib/polkit-1/polkitd --no-debug
             |-tqtuned.service
             | -1611 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
             |-systemd-journald.service
             | -18 /usr/lib/systemd/systemd-journald
             |-sshd.service
             | -1607 /usr/sbin/sshd -D
             |-crond.service
             | -269 /usr/sbin/crond -n
             |-NetworkManager.service
             | -804 /usr/sbin/NetworkManager --no-daemon
             |-systemd-hostnamed.service
             | -840 /usr/lib/systemd/systemd-hostnamed
             |-rsyslog.service
             | -1612 /usr/sbin/rsyslogd -n
             |-firewalld.service
             | - 306 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
             | -2043 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
             |-postfix.service
             | -1833 /usr/libexec/postfix/master -w
             | -1841 pickup -l -t unix -u
             | -1842 qmgr -l -t unix -u
             |-dbus.service
             | -237 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
             |-system-getty.slice
             | -getty@tty1.service
             |   -290 /sbin/agetty --noclear tty1 linux
             |-systemd-logind.service
               -265 /usr/lib/systemd/systemd-logind
```

systemd-journald.service と dbus.service 以外は全部落とす
(ubi7 を参考)

```
systemctl stop systemd-logind.service
systemctl disable systemd-logind.service

systemctl stop system-getty.slice

systemctl stop postfix.service
systemctl disable postfix.service

systemctl stop firewalld.service
systemctl disable firewalld.service

systemctl stop rsyslog.service
systemctl disable rsyslog.service

systemctl stop systemd-hostnamed.service
systemctl disable systemd-hostnamed.service

systemctl stop NetworkManager.service
systemctl disable NetworkManager.service

systemctl stop crond.service
systemctl disable crond.service

systemctl stop sshd.service
systemctl disable sshd.service

systemctl stop tuned.service
systemctl disable tuned.service

systemctl stop polkit.service
systemctl disable polkit.service

systemctl stop systemd-udevd-control.socket
systemctl stop systemd-udevd-kernel.socket
systemctl stop systemd-udevd.service

systemctl disable systemd-udevd-control.socket
systemctl disable systemd-udevd-kernel.socket
systemctl disable systemd-udevd.service
```

# commit して変更をベースイメージに反映

```
docker commit [コンテナ ID] centos7
```

# 参考

ここが一番詳しい
https://knowledge.sakura.ad.jp/2226/

公式
https://docs.docker.com/develop/develop-images/baseimages/
http://docs.docker.jp/engine/userguide/eng-image/baseimages.html

RHEL 系コンテナを作成するシェル
https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh