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