Introduction

恥ずかしながら、今までマルチステージビルドを避けてきたが、実行リソースの削減を考える必要が出てきたので、本気出して取り組むことにした。
アプリのビルドに使う docker イメージは gcc や数多の開発バイナリが乗っているため、バカにならないイメージサイズになる。
それをマルチステージビルドにより、最初のステージングで生成したアプリのバイナリを後段のステージングにコピーし、必要な実行ランタイムのみをインストールすることで対処するのだが、さらにイメージサイズを削減できる手段があるとのこと。

それが DockerSlim (Slim、正式名称 SlimToolkit)
昔は DockerSlim だったが、今は Slim とのこと。
ググラビリティが低すぎるので SlimToolkit が完全名らしい。

How work?

About Slim

公式 によると

Slim

のようになっており、下記の理解である。

  • 対象のイメージを一時的なコンテナで起動
  • ヒューリスティックに SSL 証明書やシェルを検出
  • ファイルアクセス、syscall、証明書の利用状況から必要なファイルを選別 (動的解析)
  • セキュリティの向上支援
    • 不要なファイルを削除することによる、攻撃アクターの攻撃対象を物理的に削減
    • Seccomp (Secure Computing mode) を使用しシステムコールの制限 (サンドボックス環境構築) の支援 (コンテナ実行時のオプション)
    • AppArmor を使用し、プロセスによるファイルアクセス、ネットワーク、能力 (Capability) 制限の支援 (コンテナ実行時のオプション)

Try

実際に使ってみる。
まず Slim をインストールする。

1
2
3
4
$ sudo -E mkdir -p /usr/local/bin
$ curl -sL https://raw.githubusercontent.com/slimtoolkit/slim/master/scripts/install-slim.sh | sudo -E bash -
$ slim --version
mint version linux/amd64|Aurora|1.41.8-1-g4b0d7e91|4b0d7e915ef33a98a2b32ccc10c8558086b27fe4|2025-12-12_05:28:51AM

続いて削減を行う Dockerfile を用意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
FROM ubuntu:24.04 AS builder

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
git \
wget \
libz3-dev \
ca-certificates \
&& apt-get clean && rm -rf /var/lib/apt/lists/*

RUN update-ca-certificates

# install latest cmake
ENV CMAKE_VERSION=3.31.12
RUN CMAKE_FILE=cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz \
&& CMAKE_URL=https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_FILE} \
&& wget ${CMAKE_URL} && tar -xzf ${CMAKE_FILE} \
&& rm ${CMAKE_FILE} \
&& mv ${CMAKE_FILE%.tar.gz} /opt/cmake \
&& ln -s /opt/cmake/bin/* /usr/bin

# build and install opencv
WORKDIR /opt/sources/opencv
ENV OPENCV_VERSION=4.13.0
RUN git clone -b ${OPENCV_VERSION} https://github.com/opencv/opencv . \
&& mkdir -p /opt/sources/opencv/build \
&& mkdir -p /opt/packages/opencv \
&& cmake -D CMAKE_INSTALL_PREFIX=/opt/packages/opencv \
-D CMAKE_BUILD_TYPE=Release \
-D BUILD_SHARED_LIBS=ON \
-D BUILD_LIST=core,gapi,videoio \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_world=OFF \
-D BUILD_opencv_java=OFF \
-D BUILD_opencv_python=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_TIFF=ON \
-D WITH_JASPER=OFF \
-D WITH_IMGCODEC_HDR=OFF \
-D WITH_IMGCODEC_PFM=OFF \
-D WITH_IMGCODEC_PXM=OFF \
-D WITH_IMGCODEC_SUNRASTER=OFF \
-D WITH_OPENEXR=OFF \
-D WITH_OPENJPEG=OFF \
-D WITH_TIFF=ON \
-D WITH_WEBP=OFF \
-D WITH_DSHOW=OFF \
-D WITH_FFMPEG=OFF \
-D WITH_GSTREAMER=OFF \
-D WITH_MSMF=OFF \
-D WITH_OBSENSOR=OFF \
-D WITH_VA=OFF \
-D WITH_ITT=OFF \
-D WITH_EIGEN=OFF \
-D WITH_IPP=OFF \
-D WITH_PROTOBUF=OFF \
-D WITH_OPENCL=OFF \
-D WITH_FLATBUFFERS=OFF \
-B /opt/sources/opencv/build \
-S /opt/sources/opencv \
&& cmake --build /opt/sources/opencv/build --config Release --parallel $nproc --target install

# app
WORKDIR /opt/sources/app
ADD CMakeLists.txt .
ADD main.cpp .
RUN mkdir -p /opt/sources/app/build \
&& mkdir -p /opt/packages/app \
&& cmake -D CMAKE_INSTALL_PREFIX=/opt/packages/app \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_PREFIX_PATH=/opt/packages/opencv \
-D OpenCV_DIR=/opt/packages/opencv/lib/cmake/opencv4 \
-B /opt/sources/app/build \
-S /opt/sources/app \
&& cmake --build /opt/sources/app/build --config Release --parallel $nproc --target install

FROM ubuntu:24.04 AS runtime

RUN apt-get update && apt-get install -y --no-install-recommends \
libz3-4 \
&& apt-get clean && rm -rf /var/lib/apt/lists/*

WORKDIR /app
ADD *.tiff /app
COPY --from=builder /opt/packages/app/* /app
COPY --from=builder /opt/packages/opencv/lib/* /opt/opencv
ENV LD_LIBRARY_PATH=/opt/opencv:$LD_LIBRARY_PATH

上記でビルドするアプリ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <chrono>
#include <iostream>
#include <thread>

#include <opencv2/opencv.hpp>

int32_t main(int32_t argc, const char **argv)
{
const std::chrono::seconds interval(5);

auto next_tick = std::chrono::steady_clock::now();

std::cout << "[Info] Starting loop" << std::endl;

try
{
const auto path = argv[1];
while (true)
{
next_tick += interval;

const auto image = cv::imread(path, cv::IMREAD_COLOR);
if (image.empty())
{
std::cerr << "[Error] Failed to read image: " << path << std::endl;
return -1;
}

std::cout << "[Info] " << path << " (w: " << image.cols << ", h: " << image.rows << ")" << std::endl;

std::this_thread::sleep_until(next_tick);
}
}
catch (const std::exception &e)
{
std::cerr << "[Error] " << e.what() << std::endl;
return -1;
}

std::cout << "[Info] Finished loop" << std::endl;

return 0;
}

仕様は下記

  • 引数でコンテナ内の画像ファイルを 5 秒周期で読み取り、その画像の幅と高さを標準出力に書き込む
  • 画像ファイル /app/4.1.01.tiff/app/4.2.07.tiff が存在

このアプリを含む Docker イメージをスリム化する。

1
2
3
4
5
$ docker build -t docker-slim-exp-app .
$ docker images | grep 24.04
ubuntu 24.04 0b1ebe5dd426 2 weeks ago 78.1MB
$ docker images | grep docker-slim-exp-app
docker-slim-exp-app latest ec6614b6f9d1 46 seconds ago 164MB

元の ubuntu:24.04 のサイズが 78.1 MB だったが、マルチステージビルドで必要なファイルのみを選別したとはいえ 164 MB まで膨れ上がった。
ちなみに、マルチステージビルドを使わなかった場合は 1.48 GB だった。

スリム化を実行する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ slim build --continue-after 10 --http-probe=false -entrypoint "/app/Demo /app/4.2.07.tiff" --target docker-slim-exp-app
cmd=slim state=started
cmd=slim info=cmd.input.params image-build-engine='internal' target.type='image' target.image='docker-slim-exp-app' continue.mode='timeout' rt.as.user='true' keep.perms='true' tags=''
cmd=slim state=image.inspection.start
cmd=slim info=image id='sha256:cec1ba1f31261dfdd78dd69c3b167265e5bac88c6ee3dadbb7885b6e45d5748a' size.bytes='163989939' size.human='164 MB'
cmd=slim info=image.stack index='0' name='docker-slim-exp-app:latest' id='sha256:cec1ba1f31261dfdd78dd69c3b167265e5bac88c6ee3dadbb7885b6e45d5748a'
cmd=slim state=image.inspection.done
cmd=slim state=container.inspection.start
cmd=slim info=sensor volume='mint-sensor.1.41.8-1-g4b0d7e91' location='/usr/local/bin/mint-sensor' filemode='-rwxr-xr-x' version='linux/amd64|Aurora|1.41.8-1-g4b0d7e91|4b0d7e915ef33a98a2b32ccc10c8558086b27fe4|2025-12-12_05:28:51AM'
cmd=slim info=container id='75790773490fb7237215739b158b40d83f719c0f3a8da45b99f295c6fb2609b7' status='created' name='mintk_1117572_20260430102412'
cmd=slim info=container status='running' name='mintk_1117572_20260430102412' id='75790773490fb7237215739b158b40d83f719c0f3a8da45b99f295c6fb2609b7'
cmd=slim info=container message='obtained IP address' ip='172.17.0.2'
cmd=slim info=cmd.startmonitor status='sent'
cmd=slim info=event.startmonitor.done status='received'
cmd=slim info=container name='mintk_1117572_20260430102412' id='75790773490fb7237215739b158b40d83f719c0f3a8da45b99f295c6fb2609b7' target.port.list='' target.port.info='' message='YOU CAN USE THESE PORTS TO INTERACT WITH THE CONTAINER'
cmd=slim info=continue.after mode='timeout' message='no input required, execution will resume after the timeout'
cmd=slim prompt='waiting for the target container (10 seconds)'
cmd=slim info=event message='done waiting for the target container'
cmd=slim state=container.inspection.finishing
cmd=slim state=container.inspection.artifact.processing
cmd=slim state=container.inspection.done
cmd=slim state=building message="building optimized image" engine=internal
cmd=slim state=completed
cmd=slim info=results status='MINIFIED' by='7.24X' size.original='164 MB' size.optimized='23 MB'
cmd=slim info=results image-build-engine='internal' image.name='docker-slim-exp-app.slim' image.size='23 MB' image.id='sha256:ce8bbb25e49cb31b565dc8af5b02576d2f1f96340b53c996c03997dec0531121' image.digest='sha256:ea149ef79e0d2dba265130c05e897c04e1cbfcbc7482e630d17eb4b96a3eccbb' has.data='true'
cmd=slim info=results artifacts.location='/tmp/mint-state/.mint-state/images/cec1ba1f31261dfdd78dd69c3b167265e5bac88c6ee3dadbb7885b6e45d5748a/artifacts'
cmd=slim info=results artifacts.report='creport.json'
cmd=slim info=results artifacts.dockerfile.reversed='Dockerfile.reversed'
cmd=slim info=results artifacts.seccomp='docker-slim-exp-app-seccomp.json'
cmd=slim info=results artifacts.apparmor='docker-slim-exp-app-apparmor-profile'
cmd=slim state=done
cmd=slim info=commands message='use the xray command to learn more about the optimize image'
cmd=slim info=report file='slim.report.json'
cmd=slim info=version status='OUTDATED' local='1.41.8-1-g4b0d7e91' current='1.41.8'
cmd=slim message='Your version of MinToolkit is out of date! Use `mint update` to get the latest version.'
app='mint' message='GitHub Discussions' info='https://github.com/mintoolkit/mint/discussions'
app='mint' message='Join the CNCF Slack channel to ask questions or to share your feedback' info='https://cloud-native.slack.com/archives/C059QP1RH1S'
app='mint' message='Join the Discord server to ask questions or to share your feedback' info='https://discord.gg/fAvq4ruKsG'

削減が完了したのでサイズを確認する。

1
2
3
$ docker images | grep docker-slim-exp-app 
docker-slim-exp-app.slim latest ce8bbb25e49c About a minute ago 22.7MB
docker-slim-exp-app latest cec1ba1f3126 13 hours ago 164MB

元の ubuntu:24.04 の1/3 以下にまで削減できた。
続いて、このスリム化したイメージ docker-slim-exp-app.slim を動かしてみる。

1
2
3
4
5
docker run --rm --name docker-slim-exp-app.slim -it docker-slim-exp-app.slim /app/Demo /app/4.2.07.tiff
[Info] Starting loop
[Info] /app/4.2.07.tiff (w: 512, h: 512)
[Info] /app/4.2.07.tiff (w: 512, h: 512)
[Info] /app/4.2.07.tiff (w: 512, h: 512)

正しく動いている。
ここで、事前にコンテナイメージに含めておいた別の画像ファイルを指定してみる。

1
2
3
4
$ docker run --rm --name docker-slim-exp-app.slim -it docker-slim-exp-app.slim /app/Demo /app/4.1.01.tiff
[Info] Starting loop
[ WARN:0@0.002] global loadsave.cpp:278 findDecoder imread_('/app/4.1.01.tiff'): can't open/read file: check file path/integrity
[Error] Failed to read image: /app/4.1.01.tiff

消えてなくなっていることがわかる。
DockerSlim の基本動作である「不要なファイルの削除」が実勢されていることがわかる。

対処方法は DockerSlim での解析作業中に必要なファイルにアクセスさせることになるが、全ての動作パターンを網羅するのが厳しいということもあるので、事前にホワイトリストを作って対処もできる。

1
2
3
4
5
6
$ slim build --continue-after 10 --http-probe=false -entrypoint "/app/Demo /app/4.2.07.tiff" --target docker-slim-exp-app --include-path /app/4.1.01.tiff

$ docker run --rm --name docker-slim-exp-app.slim -it docker-slim-exp-app.slim /app/Demo /app/4.1.01.tiff
[Info] Starting loop
[Info] /app/4.1.01.tiff (w: 256, h: 256)
[Info] /app/4.1.01.tiff (w: 256, h: 256)

無事に動いた。

ちなみにシェルも削除されているのでコンテナの中に入ることもできなくなっている。

1
2
$ docker run --rm -it --name docker-slim-exp-app.slim docker-slim-exp-app.slim /bin/bash
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown.

Security

SeccompAppArmor の適用に必要なプロファイルが生成されるので適用してみる。

1
$ slim build --continue-after 10 --http-probe=false -entrypoint "/app/Demo /app/4.2.07.tiff" --target docker-slim-exp-app --copy-meta-artifacts $PWD/artifacts --remove-file-artifacts

$PWD/artifacts

  • creport.json
  • docker-slim-exp-app-apparmor-profile
  • docker-slim-exp-app-seccomp.json

が出力されるので使ってみる。

Seccomp
1
2
$ docker run --rm --name docker-slim-exp-app.slim --security-opt seccomp:artifacts/docker-slim-exp-app-seccomp.json -it docker-slim-exp-app.slim /app/Demo /app/4.2.07.tiff
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error closing exec fds: ensure /proc/self/fd is on procfs: operation not permitted: unknown.

動かないので少し調べると Incorrect generated seccomp profile for ASP.NET Core app #182 にて fstatfs を Seccomp のプロファイルに追加すれば動くようになる、と。

artifacts/docker-slim-exp-app-seccomp.json を下記のように直す。

1
2
3
4
5
6
7
8
9
10
11
12
13
        "getrandom",
"fstat",
"getdents64",
- "getpid"
+ "getpid",
+ "fstatfs"
],
"action": "SCMP_ACT_ALLOW",
"includes": {},
"excludes": {}
}
]
}

再度コンテナを起動すると動くようになった。
ちなみに、存在しないファイルを指定するとエラーメッセージが変わる。

1
2
3
4
$ docker run --rm --name docker-slim-exp-app.slim --security-opt seccomp:artifacts/docker-slim-exp-app-seccomp.json -it docker-slim-exp-app.slim /app/Demo /app/4.1.01.tiff
[Info] Starting loop
[ WARN:0@0.002] global loadsave.cpp:278 findDecoder imread_('/app/4.1.01.tiff'): can't open/read file: check file path/integrity
[Error] Failed to read image: /app/4.1.01.tiff
AppArmor

まず、プロファイルを AppArmor に読ませる。

1
$ sudo apparmor_parser -r -W $PWD/artifacts/docker-slim-exp-app-apparmor-profile

コンテナを起動

1
2
$ docker run --rm --name docker-slim-exp-app.slim --security-opt apparmor:docker-slim-exp-app-apparmor-profile -it docker-slim-exp-app.slim /app/Demo /app/4.2.07.tiff
/app/Demo: error while loading shared libraries: libopencv_imgcodecs.so.413: failed to map segment from shared object

が、動かない。
AI に聞くと、「.so ファイル(共有ライブラリ)をメモリ上に展開(map)しようとしたが、権限がなくて失敗した」 とのことなので、プロファイルを修正して実行権限をつける。

docker-slim-exp-app-apparmor-profile を下記のように修正する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
profile docker-slim-exp-app-apparmor-profile flags=(attach_disconnected,mediate_deleted) {

network,

/app/Demo rix,


/app r,
/app/4.2.07.tiff r,
/bin r,
/etc/host.conf r,
/etc/ld.so.cache r,
/etc/nsswitch.conf r,
/etc/passwd r,
/etc/resolv.conf r,
/lib r,
- /lib/x86_64-linux-gnu/libc.so.6 r,
- /lib/x86_64-linux-gnu/libgcc_s.so.1 r,
- /lib/x86_64-linux-gnu/libm.so.6 r,
- /lib/x86_64-linux-gnu/libstdc++.so.6 r,
- /lib/x86_64-linux-gnu/libstdc++.so.6.0.33 r,
+ /lib/x86_64-linux-gnu/libc.so.6 rix,
+ /lib/x86_64-linux-gnu/libgcc_s.so.1 rix,
+ /lib/x86_64-linux-gnu/libm.so.6 rix,
+ /lib/x86_64-linux-gnu/libstdc++.so.6 rix,
+ /lib/x86_64-linux-gnu/libstdc++.so.6.0.33 rix,
/lib64 r,
- /opt/opencv/libopencv_core.so.413 r,
- /opt/opencv/libopencv_imgcodecs.so.413 r,
- /opt/opencv/libopencv_imgproc.so.413 r,
+ /opt/opencv/libopencv_core.so.413 rix,
+ /opt/opencv/libopencv_imgcodecs.so.413 rix,
+ /opt/opencv/libopencv_imgproc.so.413 rix,
/run r,
/tmp r,
/usr/bin r,
/usr/bin/ld.so rix,
/usr/lib r,
- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 r,
- /usr/lib/x86_64-linux-gnu/libc.so.6 r,
- /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 r,
- /usr/lib/x86_64-linux-gnu/libm.so.6 r,
- /usr/lib/x86_64-linux-gnu/libnss_dns.so.2 r,
- /usr/lib/x86_64-linux-gnu/libnss_files.so.2 r,
- /usr/lib/x86_64-linux-gnu/libresolv.so.2 r,
- /usr/lib/x86_64-linux-gnu/libstdc++.so.6 r,
- /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33 r,
+ /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 rix,
+ /usr/lib/x86_64-linux-gnu/libc.so.6 rix,
+ /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 rix,
+ /usr/lib/x86_64-linux-gnu/libm.so.6 rix,
+ /usr/lib/x86_64-linux-gnu/libnss_dns.so.2 rix,
+ /usr/lib/x86_64-linux-gnu/libnss_files.so.2 rix,
+ /usr/lib/x86_64-linux-gnu/libresolv.so.2 rix,
+ /usr/lib/x86_64-linux-gnu/libstdc++.so.6 rix,
+ /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33 rix,
/usr/lib64 r,
- /usr/lib64/ld-linux-x86-64.so.2 rix,
+ /usr/lib64/ld-linux-x86-64.so.2 rix,

}

これでコンテナが起動するようになった。
が、コンテナが終了できなくなった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ docker stop docker-slim-exp-app.slim
Error response from daemon: cannot stop container: docker-slim-exp-app.slim: permission denied

$ docker kill docker-slim-exp-app.slim
Error response from daemon: cannot kill container: docker-slim-exp-app.slim: permission denied

$ sudo systemctl restart docker
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20a763a9bd28 docker-slim-exp-app.slim "/app/Demo /app/4.2.…" 2 minutes ago Up 2 minutes docker-slim-exp-app.slim

$ ps aux | grep /app/Demo
t-takeu+ 8068 0.0 0.0 1920856 28484 pts/0 Sl+ 21:59 0:00 docker run --rm --name docker-slim-exp-app.slim --security-opt apparmor:docker-slim-exp-app-apparmor-profile -it docker-slim-exp-app.slim /app/Demo /app/4.2.07.tiff
root 8116 0.1 0.0 22544 10036 pts/0 Ss+ 21:59 0:00 /app/Demo /app/4.2.07.tiff
t-takeu+ 8896 0.0 0.0 10264 2896 pts/3 S+ 22:02 0:00 grep --color=auto /app/Demo
$ sudo kill -9 8116
kill: (8116): Permission denied

docker stopdocker kill もダメ。
デーモンを再起動しても意味なし。
直接プロセスを kill してもダメ。

そこでふと思った。
SIGKILL すら防ぐのは AppArmor が邪魔をしているからでは?、と思い。
適用したプロファイルをアンロードしてみた。

1
2
3
4
5
6
7
$ sudo apparmor_parser -R $PWD/artifacts/docker-slim-exp-app-apparmor-profile

$ sudo aa-status | grep docker
docker-default
/sbin/tini (7009) docker-default
/opt/nodejs/node-v24.13.1/bin/node (7043) docker-default
/opt/nodejs/node-v24.13.1/bin/node (7095) docker-default

プロファイルがないことを確認後、docker stop すると停止が確認できた。
肝が冷えた。

Option

DockerSlim にはたくさんのオプションがあるが、自分が使ったのは下記

option description
–continue-after <sec> DockerSlim で解析中、何秒後に自動終了するか。上記のコンソールのように終了処理を与えられない場合に使用。
–http-probe=<true/false> HTTP プロービングを使用するかどうか。DockerSlim の解析中に外部からの HTTP リクエストで生存確認などに使用。今回のコンソールアプリでは false にしないと解析エラーになる
-entrypoint <command> DockerSlim での解析中に実行するエントリポイント。Dockerfile に記載した ENTRYPOINTP を上書きできる。この指定を使ってアプリに動作を行わせるので、アプリを完全動作させる自指示を与えること。
–target <image name> スリム化する DockerSlim の解析対象となる Docker イメージ
–include-path </path/to/file> スリム化から除外するファイル/フォルダへのパス。複数指定可能。
例:--include-path /path/to/a.png --include-path /path/to/b.png
–copy-meta-artifacts </path/to/output/dir> Seccomp や AppArmor のプロファイルを含むメタデータの出力先。通常は `/tmp/mint-state/.mint-state/images/<英数字64文字> に出力される
–remove-file-artifacts Seccomp や AppArmor のプロファイル、Docker イメージを含むメタデータの削除。通常は `/tmp/mint-state/.mint-state/images/<英数字64文字> に出力されるがこれを削除する

まとめ

イメージサイズを確実に削減でき、強力なセキュリティ機能の実行も支援でききるので今後も使っていきたい。
ところで、DockerSlim があれば、マルチステージビルドは不要か?、というとそれは間違いで、

  • マルチステージビルドは: 「これが必要である」という確実な事実に基づき、必要なものだけを丁寧に選別して積み上げる (静的な保証)
  • DockerSlim は「動いている最中にこれを使った」という観察結果に基づき、残りを削る )動的な最適化)

であり、似てはいるが役割が違う。
また、DockerSlim はイメージを作った後に「さらに解析して作り直す」という工程を追加するため、ビルド時間が非常に長くなるので、元のイメージサイズが小さいに越したことはない。
これは CI/CD の効率化に直結する。