最近尝试了从Scratch开始建立Docker镜像,整体来说并不难,就是从现在运行良好的linux机器上,把需要的文件放到Docker镜像里就好了。正确的做法是,使用工具直接生成你需要的镜像,尽量不要自己折腾。但我是手工处理的,为了就是折腾。
第一部分的目标,就是实现Linux的基本功能。
1、新建文件夹neodeb01,把你想放到Docker中的文件放到这个目录下面,比如,我这边结构如下:
├── bin
│ ├── bash
│ ├── cat
│ ├── chmod
│ ├── chown
│ ├── cp
│ ├── date
│ ├── dd
│ ├── df
│ ├── dir
│ ├── echo
│ ├── egrep
│ ├── false
│ ├── grep
│ ├── hostname
│ ├── kill
│ ├── less
│ ├── ln
│ ├── login
│ ├── ls
│ ├── mkdir
│ ├── more
│ ├── mount
│ ├── mv
│ ├── ps
│ ├── pwd
│ ├── rm
│ ├── rmdir
│ ├── sed
│ ├── sh
│ ├── sleep
│ ├── su
│ ├── systemd
│ ├── touch
│ ├── true
│ ├── umount
│ ├── uname
│ └── which
├── boot
├── build.sh
├── dev
├── Dockerfile
├── etc
│ ├── bash.bashrc
│ ├── default
│ │ ├── cron
│ │ ├── locale
│ │ ├── networking
│ │ └── useradd
│ ├── group
│ ├── group-
│ ├── gshadow
│ ├── gshadow-
│ ├── hostname
│ ├── init
│ │ └── networking.conf
│ ├── init.d
│ │ ├── hostname.sh
│ │ └── networking
│ ├── login.defs
│ ├── nsswitch.conf
│ ├── pam.conf
│ ├── pam.d
│ │ ├── atd
│ │ ├── chfn
│ │ ├── chpasswd
│ │ ├── chsh
│ │ ├── common-account
│ │ ├── common-auth
│ │ ├── common-password
│ │ ├── common-session
│ │ ├── common-session-noninteractive
│ │ ├── cron
│ │ ├── gdm-autologin
│ │ ├── gdm-launch-environment
│ │ ├── gdm-password
│ │ ├── login
│ │ ├── newusers
│ │ ├── other
│ │ ├── passwd
│ │ ├── polkit-1
│ │ ├── ppp
│ │ ├── runuser
│ │ ├── runuser-l
│ │ ├── sshd
│ │ ├── su
│ │ ├── sudo
│ │ └── systemd-user
│ ├── passwd
│ ├── passwd-
│ ├── profile
│ ├── security
│ │ ├── access.conf
│ │ ├── group.conf
│ │ ├── limits.conf
│ │ ├── limits.d
│ │ ├── namespace.conf
│ │ ├── namespace.d
│ │ ├── namespace.init
│ │ ├── opasswd
│ │ ├── pam_env.conf
│ │ ├── pwquality.conf
│ │ ├── sepermit.conf
│ │ └── time.conf
│ ├── services
│ ├── shadow
│ ├── shadow-
│ ├── skel
│ ├── subgid
│ └── subuid
├── home
├── lib
│ ├── terminfo
│ │ └── l
│ │ └── linux
│ └── x86_64-linux-gnu
│ ├── libacl.so.1
│ ├── libattr.so.1
│ ├── libaudit.so.1
│ ├── libaudit.so.1.0.0
│ ├── libblkid.so.1
│ ├── libbz2.so.1
│ ├── libbz2.so.1.0
│ ├── libbz2.so.1.0.4
│ ├── libcap.so.2
│ ├── libcrypt-2.19.so
│ ├── libcryptsetup.so.4
│ ├── libcryptsetup.so.4.6.0
│ ├── libcrypt.so.1
│ ├── libc.so.6
│ ├── libdl-2.19.so
│ ├── libdl.so.2
│ ├── libkmod.so.2
│ ├── libkmod.so.2.2.8
│ ├── libmount.so.1
│ ├── libm.so.6
│ ├── libncurses.so.5
│ ├── libncurses.so.5.9
│ ├── libnsl-2.19.so
│ ├── libnsl.so.1
│ ├── libnss_compat-2.19.so
│ ├── libnss_compat.so.2
│ ├── libpamc.so.0
│ ├── libpamc.so.0.82.1
│ ├── libpam_misc.so.0
│ ├── libpam_misc.so.0.82.0
│ ├── libpam.so.0
│ ├── libpam.so.0.83.1
│ ├── libpcre.so.3
│ ├── libprocps.so.3
│ ├── libpthread.so.0
│ ├── libreadline.so.6
│ ├── libreadline.so.6.3
│ ├── librt.so.1
│ ├── libselinux.so.1
│ ├── libsepol.so.1
│ ├── libtinfo.so.5
│ ├── libuuid.so.1
│ ├── libz.so.1
│ └── libz.so.1.2.8
├── lib64
│ └── ld-linux-x86-64.so.2
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
│ ├── bin
│ │ ├── awk
│ │ ├── basename
│ │ ├── clear
│ │ ├── diff
│ │ ├── diff3
│ │ ├── du
│ │ ├── env
│ │ ├── find
│ │ ├── gawk
│ │ ├── id
│ │ ├── passwd
│ │ ├── size
│ │ ├── sort
│ │ ├── time
│ │ ├── vi
│ │ ├── which
│ │ ├── who
│ │ └── whoami
│ ├── lib
│ │ ├── libbfd-2.25-system.so
│ │ └── x86_64-linux-gnu
│ │ ├── libgmp.so.10
│ │ ├── libgmp.so.10.2.0
│ │ ├── libmpfr.so.4
│ │ ├── libmpfr.so.4.1.2
│ │ ├── libsemanage.so.1
│ │ ├── libsigsegv.so.2
│ │ ├── libsigsegv.so.2.0.3
│ │ └── libustr-1.0.so.1
│ └── sbin
│ ├── chgpasswd
│ ├── chpasswd
│ ├── chroot
│ ├── groupadd
│ ├── groupdel
│ ├── groupmod
│ ├── service
│ ├── useradd
│ ├── userdel
│ └── usermod
└── var
2、Dockerfile文件
From scratch
ENV PATH /bin:/sbin:/usr/bin:/usr/sbin:$PATH
COPY . /
RUN /bin/ln -s lib64/ld-linux-x86-64.so.2 lib/x86_64-linux-gnu/
CMD /bin/bash
3、build.sh文件
#/bin/sh
sudo docker build -t neodeb01 .
4、.dockerignore文件
Dockerfile
build.sh
*.swp
5、新建镜像并运行
sudo docker build -t neodeb01 .
sudo docker run -it neodeb01
PS:
一定要先把ld-linux-x86-64.so.2放到镜像中,否则无论你执行什么命令,镜像系统都告诉你
System error: no such file or directory
我在这个上面浪费了不少时间,学艺不精啊
PS1:
如果遇到I have no name的错误,一般是因为etc下的几个配置文件错误导致的,shadow gshadow group passwd。
但精简掉libnss_compat后,也会报同样的错误。
PS2:
如果遇到unknown terminal type的问题,要修改两个地方。一个是在.bashrc中
export TERM=linux
另一个是,要把文件夹/lib/terminfo中需要的内容,一起拷贝过去。