[Docker] ShellとExec形式

Shell形式
– 利点: 記述が簡単、シェル変数展開が利用できる
– 欠点: /bin/sh -c を渡して実行するため、イメージに /bin/sh が含まれてなければならない

Exce形式
– 利点: イメージに /bin/sh が必要ないため、イメージサイズと攻撃面を削減できる
– 欠点: 記述が面倒で、シェル変数展開できない

### Shell形式
Dockefile

FROM busybox
ENV COUNT 3
CMD /bin/ping -c $COUNT 8.8.8.8

$ sudo docker build -t test .
$ sudo docker run –rm –name test test

FROM busybox AS source
FROM scratch
COPY --from=source /bin/busybox /bin/pin
ENV COUNT 3
CMD /bin/ping -c $COUNT 8.8.8.8

### Exec形式
Exec形式は、指定のコマンドを直接実行するもの
Shell形式である必要はないが、JSOフォーマットで記述しないといけない

FROM busybox
CMD ["/bin/ping", "-c", "3", "8.8.8.8"]
FROM busybox AS source
FROM scratch
COPY --from=source /bin/busybox /bin/pin
CMD ["/bin/ping", "-c", "3", "8.8.8.8"]

EXECだとシェル変数展開ができないが、/bin/shは必要ないのね
ShellとExec形式の2種類があるってことはわかった。