東京生まれHOUSE MUSIC育ち

悪そうな奴はだいたい友達なの?

ラジオ録音のdockerイメージを50%以上削減した


スポンサードリンク

ラジオ録音の更新でdockerを使用しようと計画しています。

イメージが264MBある。減らしたい。

dockerのイメージが微妙に大きいので、小さくしてみようと思います。現状のDockerファイルだと、以下のように264MBです。ラジオを録音するだけなので、もう少し小さくしたいです。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
radio0              latest              26e62370a9c1        26 seconds ago      264MB

使用しているDockerファイル以下です。debian:9.5-slimをベースに作成したイメージです。

FROM debian:9.5-slim
RUN apt-get update && apt-get -y upgrade && apt-get -y install \
    rtmpdump \
    swftools \
    libxml2-utils \
    ffmpeg \
    libavcodec-extra \
    wget \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
COPY ./rec_radiko.sh /usr/local/bin/
ENV TZ Asia/Tokyo
WORKDIR /usr/volume

イメージを減らすなら、alpine linux

イメージのサイズを小さくするなら、alpine linuxを使うのが良いってじっちゃんが言ってました。

なので、alpine linuxを利用します。alpine linuxのバージョンは3.10.3です。

FROM alpine:3.10.3
RUN apk add \
    --no-cache \
    --repository http://dl-3.alpinelinux.org/alpine/edge/testing \
    libtool automake autoconf nasm vips-dev fftw-dev gcc g++ make libc6-compat \
    rtmpdump \
    libxml2-utils \
    ffmpeg \
    wget
RUN apk update \
    && wget http://swftools.org/swftools-0.9.2.tar.gz \
    && tar -xvf swftools-0.9.2.tar.gz  \
    && cd swftools-0.9.2 \
    && LIBRARY_PATH=/lib:/usr/lib ./configure \
    && make \
    # Makefile includes rm with -o flag
    && sed -e 's/-o -L/#-o -L/' -i swfs/Makefile \
    && make install \
    && rm -rf /var/cache/apk/* \
    && rm -rf /swftools-0.9.2
COPY ./rec_radiko.sh /usr/local/bin/
ENV TZ Asia/Tokyo
WORKDIR /usr/volume

alpine linuxを使用したら、120MBも増えた

小さくなっていることを期待したのに、大きくなっていました

イメージ「radio1」がalpine:latestをベースとして作成したイメージで、387MBです。

約120MBも大きくなっています。

# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
radio1              latest              88758eecbac9        16 minutes ago      387MB

マルチステージビルドを使ってみたら、50%以上の削減!

swftoolsのコンパイルが必要で、コンパイル用のパッケージやソース等をダウンロードしているのが、イメージサイズを大きくした原因と考えました。

そこで、マルチステージビルドを利用して、swftoolsのコンパイルを分けてみました。

FROM alpine:3.10.3 as swftools
RUN apk add \
    --no-cache \
    --repository http://dl-3.alpinelinux.org/alpine/edge/testing \
    libtool automake autoconf nasm vips-dev fftw-dev gcc g++ make libc6-compat \
    && wget http://swftools.org/swftools-0.9.2.tar.gz \
    && tar -xvf swftools-0.9.2.tar.gz  \
    && cd swftools-0.9.2 \
    && LIBRARY_PATH=/lib:/usr/lib ./configure \
    && make \
    # Makefile includes rm with -o flag
    && sed -e 's/-o -L/#-o -L/' -i swfs/Makefile \
    && make install \
    && rm -rf /var/cache/apk/* \
    && rm -rf /swftools-0.9.2

FROM alpine:3.10.3
RUN apk add \
    --no-cache \
    --repository http://dl-3.alpinelinux.org/alpine/edge/testing \
    rtmpdump \
    libxml2-utils \
    ffmpeg \
    bash \
    perl \
    curl \
    wget

COPY --from=swftools /usr/local/bin/swfextract /usr/local/bin/

COPY ./rec_radiko.sh /usr/local/bin/
ENV TZ Asia/Tokyo
WORKDIR /usr/volume

マルチステージビルドを利用したら、100MBになりました!初期の264MBから半分以下のサイズになりました。試しにこれを使って試運転していこうと思います。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker_rec_radiko   latest              8fbb38e1bf95        23 hours ago        100MB

f:id:padobure:20191212214413j:plain