全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 46549|回复: 60
打印 上一主题 下一主题

[Windows VPS] 为国产龙芯mips架构Linux制作docker精简镜像

[复制链接]
跳转到指定楼层
1#
发表于 2018-4-27 10:00:12 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
83金钱
我最近在做docker和kubernetes 本土化的工作

通过打包国产Linux关键系统文件,可以制作出能用的mips架构下的docker镜像
但是即使是最小安装的国产Linux,打包之后做成的docker镜像也有800MB+,这样太重了,传输什么的都很不方便

理想是像centos、debian官方那种,几十MB的镜像

现在的问题是,因为MIPS/X86架构的不同,docker hub上面的alpine,busybox镜像都不能用
也就是说我没办法 在dockerfile中
from alpine 类似这样基于现有的镜像去做

有没有大佬能指出一条明路,如何从零开始制作一份不超过100MB的docker镜像

2#
 楼主| 发表于 2018-4-27 10:06:20 | 显示全部楼层
万人迷 发表于 2018-4-27 10:05
这个是基本功了
熟悉底层的东西了吧

没办法,为了国产系统的崛起而奋斗

3#
 楼主| 发表于 2018-4-27 10:40:59 | 显示全部楼层
ggeeii 发表于 2018-4-27 10:24
到现在何止烧了几十亿?

国产芯片烧钱多,据我所知系统这块还真没烧多少钱

君不见,红旗Linux都破产了,也没见zf出来托底
4#
 楼主| 发表于 2018-4-27 11:32:56 | 显示全部楼层
找到解决方案了

目标国产系统核心包如下:
acl attr audit basesystem bash coreutils cpio cronie dhclient e2fsprogs filesystem glibc initscripts iproute iptables iptables-ipv6 iputils kbd ncurses openssh-server passwd policycoreutils procps rootfiles rpm rsyslog selinux-policy-targeted setup shadow-utils sudo usbtray util-linux-ng vim-minimal yum

经过精简的核心包如下:
basesystem bash coreutils filesystem iputils passwd  procps rootfiles rpm shadow-utils vim-minimal yum

执行脚本:
bash <script_name> -g null -p basesystem bash coreutils filesystem iputils passwd  procps rootfiles rpm shadow-utils vim-minimal yum

制作镜像的脚本如下:


  1. #!/usr/bin/env bash

  2. set -e

  3. usage() {
  4.     cat <<EOOPTS
  5. $(basename $0) [OPTIONS] <name>
  6. OPTIONS:
  7.   -p "<packages>"  The list of packages to install in the container.
  8.                    The default is blank.
  9.   -g "<groups>"    The groups of packages to install in the container.
  10.                    The default is "Core".
  11.   -y <yumconf>     The path to the yum config to install packages from. The
  12.                    default is /etc/yum.conf for Centos/RHEL and /etc/dnf/dnf.conf for Fedora
  13. EOOPTS
  14.     exit 1
  15. }

  16. # option defaults
  17. yum_config=/etc/yum.conf
  18. if [ -f /etc/dnf/dnf.conf ] && command -v dnf &> /dev/null; then
  19.         yum_config=/etc/dnf/dnf.conf
  20.         alias yum=dnf
  21. fi
  22. install_groups="Core"
  23. while getopts ":y:p:g:h" opt; do
  24.     case $opt in
  25.         y)
  26.             yum_config=$OPTARG
  27.             ;;
  28.         h)
  29.             usage
  30.             ;;
  31.         p)
  32.             install_packages="$OPTARG"
  33.             ;;
  34.         g)
  35.             install_groups="$OPTARG"
  36.             ;;
  37.         \?)
  38.             echo "Invalid option: -$OPTARG"
  39.             usage
  40.             ;;
  41.     esac
  42. done
  43. shift $((OPTIND - 1))
  44. name=$1

  45. if [[ -z $name ]]; then
  46.     usage
  47. fi

  48. target=$(mktemp -d --tmpdir $(basename $0).XXXXXX)

  49. set -x

  50. mkdir -m 755 "$target"/dev
  51. mknod -m 600 "$target"/dev/console c 5 1
  52. mknod -m 600 "$target"/dev/initctl p
  53. mknod -m 666 "$target"/dev/full c 1 7
  54. mknod -m 666 "$target"/dev/null c 1 3
  55. mknod -m 666 "$target"/dev/ptmx c 5 2
  56. mknod -m 666 "$target"/dev/random c 1 8
  57. mknod -m 666 "$target"/dev/tty c 5 0
  58. mknod -m 666 "$target"/dev/tty0 c 4 0
  59. mknod -m 666 "$target"/dev/urandom c 1 9
  60. mknod -m 666 "$target"/dev/zero c 1 5

  61. # amazon linux yum will fail without vars set
  62. if [ -d /etc/yum/vars ]; then
  63.         mkdir -p -m 755 "$target"/etc/yum
  64.         cp -a /etc/yum/vars "$target"/etc/yum/
  65. fi

  66. if [[ -n "$install_groups" ]];
  67. then
  68.     yum -c "$yum_config" --installroot="$target" --releasever=/ --setopt=tsflags=nodocs \
  69.         --setopt=group_package_types=mandatory -y groupinstall "$install_groups"
  70. fi

  71. if [[ -n "$install_packages" ]];
  72. then
  73.     yum -c "$yum_config" --installroot="$target" --releasever=/ --setopt=tsflags=nodocs \
  74.         --setopt=group_package_types=mandatory -y install "$install_packages"
  75. fi

  76. yum -c "$yum_config" --installroot="$target" -y clean all

  77. cat > "$target"/etc/sysconfig/network <<EOF
  78. NETWORKING=yes
  79. HOSTNAME=localhost.localdomain
  80. EOF

  81. # effectively: febootstrap-minimize --keep-zoneinfo --keep-rpmdb --keep-services "$target".
  82. #  locales
  83. rm -rf "$target"/usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive}
  84. #  docs and man pages
  85. rm -rf "$target"/usr/share/{man,doc,info,gnome/help}
  86. #  cracklib
  87. rm -rf "$target"/usr/share/cracklib
  88. #  i18n
  89. rm -rf "$target"/usr/share/i18n
  90. #  yum cache
  91. rm -rf "$target"/var/cache/yum
  92. mkdir -p --mode=0755 "$target"/var/cache/yum
  93. #  sln
  94. rm -rf "$target"/sbin/sln
  95. #  ldconfig
  96. rm -rf "$target"/etc/ld.so.cache "$target"/var/cache/ldconfig
  97. mkdir -p --mode=0755 "$target"/var/cache/ldconfig

  98. version=
  99. for file in "$target"/etc/{redhat,system}-release
  100. do
  101.     if [ -r "$file" ]; then
  102.         version="$(sed 's/^[^0-9\]*\([0-9.]\+\).*$/\1/' "$file")"
  103.         break
  104.     fi
  105. done

  106. if [ -z "$version" ]; then
  107.     echo >&2 "warning: cannot autodetect OS version, using '$name' as tag"
  108.     version=$name
  109. fi

  110. tar --numeric-owner -c -C "$target" . | docker import - $name:$version

  111. docker run -i -t --rm $name:$version /bin/bash -c 'echo success'

  112. rm -rf "$target"
复制代码

点评

厉害了大佬,战略性mark  发表于 2018-4-27 13:43
5#
 楼主| 发表于 2018-4-27 13:13:54 | 显示全部楼层
GeekDuanLian 发表于 2018-4-27 12:06
有实体机吗 在哪测试

我司有龙芯的机器 各个型号都有
6#
 楼主| 发表于 2018-4-27 13:16:29 | 显示全部楼层
斜阳晚暮 发表于 2018-4-27 12:22
那么,哪里能买到便宜的龙芯笔记本呢?

我只看到过pc服务器,而且造价很贵
7#
 楼主| 发表于 2018-4-27 20:02:49 来自手机 | 显示全部楼层
本帖最后由 摸鱼小熊猫 于 2018-4-27 20:05 编辑

..
8#
 楼主| 发表于 2018-4-27 20:05:15 来自手机 | 显示全部楼层
wsycqyz 发表于 2018-4-27 18:59
请参考:Linux From Scratch,自己编译Linux,只留自己想要的东西,Linux可以做得很小小小
没有权限了链接 ...

完docker的我当然知道from scratch 想征求下建议 但是没有收到合适的 说实话这种笼统的一句话没什么帮助 ...不过还是谢谢老哥热心回答
9#
 楼主| 发表于 2018-4-28 10:10:51 | 显示全部楼层

买不起,公司有
10#
 楼主| 发表于 2018-5-1 00:38:48 来自手机 | 显示全部楼层
dabiantai 发表于 2018-4-29 14:39
1. 用LEDE
2. OpenEmbedded自己编译发行版,实测4核i5一下午就能完成从内核到各种应用的编译


谢谢老哥回复,tar打包docker镜像我知道,而且之前就是这么做的。但是打包的image太大了,要求是,在一百兆左右。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-20 17:07 , Processed in 0.069873 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表