Dockerfile
チェックツール
脆弱性スキャン
$ docker scout quickview IMAGE
$ docker scout cves IMAGE
$ docker scout recommendations IMAGE
もう chown あとでせず COPY 時にする
COPY --chown=nonroot:nonroot
ARG は stage ごとに宣言必要
PID=1 避ける
USER
code:Dockerfile
RUN groupadd -r nonroot && \
useradd -r nonroot -g nonroot
他の特権的な UIDにかぶらないよう 10000 以上がいいという話もある
code:Dockerfile
RUN groupadd -g 10001 nonroot && \
useradd -u 10000 -g nonroot nonroot
Cloud SQL Proxy は 65532
実行可能ファイルは root の所有権、書き込み不可にする、実行だけできればよい
なるべく後段で USER nonroot
builder からコピーする時になんでもかんでも chown しない
ONBUILD
派生イメージがビルドされるときのステップを追加できる
ONBUILD RUN ...
heredoc でファイルに内容を書く
code:Dockerfile
COPY <<'EOF' /etc/supervisor/conf.d/supervisord.conf
nodaemon=true
...
EOF
$HOGE など 環境変数を参照している場合、docker run 時に評価させたいなら 'EOF' のように quote する
EOF のように quote しない場合は、ヒアドキュメント自体が評価されたタイミングで変数展開が行われる
言語別
Python
RUN pip install --no-cache-dir -r requirements.lock すれば pip の cache 作られない(要確認)
**/__pycache__ も ignore しよう
Node
node ユーザーが予め居るので簡単に root 避けるなら USER node
target を指定せず base を切り替える
後半は同じで、前段部分を切り替えるパターン、nvida/cuda でやってるのを見た
4つのステージがある
FROM base
FROM base as base-amd64
FROM base as base-arm64
FROM base-${TARGETARCH}
--target は指定せずビルドする、--build-arg=TARGETARCH=... 引数は取る
TARGETARCH=amd64 だった場合 base が base-amd64 になる、arm64 でも同様
ARG はステージごとに宣言が必要だが FROM で参照できる、そしてステージの開始は FROM なので、後で宣言する変数を参照しているように見える、一瞬何してるのか分からない
code:pre
FROM base-${TARGETARCH}
ARG TARGETARCH
https://gyazo.com/8cafcc88e79602d6d6699dbe815092c4
みたいな形