将映像从Ubuntu迁移到Alpine以减少容量的示例


概述

通过将Docker基本映像从Ubuntu迁移到Alpine Linux(141MB→3MB),我能够减少Docker映像的容量。构建此映像时,请在命令行上处理一个模拟命令,并使其成为使用模拟容器作为命令的映像。下面介绍具体的迁移过程。

alpine.png

动机

访问分析工具Analog正在开发Docker容器支持。我是基于Ubuntu:14.04映像创建的,但是容量高达141MB。我们从一个假设开始,即consul的官方映像小到10MB,因为它使用了Alpine映像。为了进行验证,我决定将图像从Ubuntu迁移到Alpine

迁移Dockerfile时要考虑的要点

包管理器

我可以在Ubuntu上使用apt,但不能在Alpine上使用。您需要使用名为apk的软件包管理器,即Alpine Linux软件包管理。

  • https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management

  • apt-get update等效的命令是apk update。如果您不这样做,将无法获得包裹清单信息。

  • apt-get install <パッケージ名>的等效项是apk add <パッケージ名>

  • apt-get remove的等效项是apk del <パッケージ名>

您也可以指定apk --update add <package>来同时执行更新和安装。

为了减小

图像的大小,您可以在工作后使用apk del,或者结合使用apk cache cleanapk --no-cache add <package>清除缓存。

其他常见选项是

  • apk search <package> ...搜索软件包

  • apk info <package> ...显示包装信息

参考:https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management

营造环境

普通的Alpine不包含make环境。对于最低要求的环境,请执行以下命令。

1
# apk add make gcc g++

bash

默认外壳程序是/bin/sh,因此您不能使用Ctrl-p之类的键绑定。解决方案是添加bash包。

1
# apk add bash

时区

默认情况下保留UTC。您需要设置tzdata软件包进行更改。以下是如何设置为JST-9。

1
2
3
# apk --update add tzdata
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# apk del tzdata

参考:https://wiki.alpinelinux.org/wiki/Setting_the_timezone

重写Dockerfile

以下使用早期的Ubuntu镜像Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FROM ubuntu:14.04

RUN mkdir -p /tmp/analog && \
    apt-get update && \
    apt-get install -y make gcc wget

RUN cd /tmp/analog && \
    wget -O analog-6.0.tar.gz ftp://ftp.naist.jp/pub/sunfreeware/SOURCES/analog-6.0.tar.gz && \
    tar xfz analog-6.0.tar.gz

RUN cd /tmp/analog/analog-6.0 && \
    make DEFS='-DLANGDIR="/opt/analog/lang/"' && \
    mkdir -p /opt/analog && \
    cp -r lang /opt/analog/ && \
    mv ./analog /usr/bin/analog && \
    rm -rf /tmp/analog

COPY analog.cfg /opt/analog/analog.cfg

CMD ["+g/opt/analog/analog.cfg"]
ENTRYPOINT ["/usr/bin/analog","-G"]

将命令从Ubuntu重写为Alpine

差异信息
https://github.com/zembutsu/dockerize-analog/commit/b8ac2ebc16c2a8ff66836a2063c2394cbd94ae8a

此时,容量可以从141MB减少到51MB。

此外,为了减少Docker的映像层,可以通过将具有三行的RUN指令合并为一行来将最终映像容量减少到3MB。

最终Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM alpine:3.3

RUN mkdir -p /tmp/analog && \
    apk --no-cache add make gcc g++ && \
    cd /tmp/analog && \
    wget -O analog-6.0.tar.gz ftp://ftp.naist.jp/pub/sunfreeware/SOURCES/analog-6.0.tar.gz && \
    tar xfz analog-6.0.tar.gz && \
    cd /tmp/analog/analog-6.0 && \
    make DEFS='-DLANGDIR="/opt/analog/lang/"' && \
    mkdir -p /opt/analog && \
    cp -r lang /opt/analog/ && \
    mv ./analog /usr/bin/analog && \
    rm -rf /tmp/analog && \
    apk del make gcc g++

COPY analog.cfg /opt/analog/analog.cfg

CMD ["+g/opt/analog/analog.cfg"]
ENTRYPOINT ["/usr/bin/analog","-G"]

请也在此处检查

在Alpine Linux-Qiita上创建轻量级的Docker映像
http://qiita.com/pottava/items/970d7b5cda565b995fe7