背景
開発環境での作業時、Docker使ってプライベートリポジトリcloneした時に、秘密鍵見れちゃうのがとても気になって。とりあえず色々調べてみたのでその結果を書いてみる。
参考サイト
やったこと
以下の2つの対応をしてみた。
1. マルチステージビルド
-
何故?
docker history で不要なステージが表示されないようにするため
-
やり方、方法
as で中間成果物を保存して、最後にそこからコピーすることで、中間成果物の内容が見れない模様
# syntax = docker/dockerfile:experimental
FROM ruby:2.5 as intermediate
# 処理諸々
[・・・]
# マルチステージビルド
FROM ruby:2.5
COPY --from=intermediate / /
-
注意点
COPY前までに行った作業(ex. bundle install)で何かしらディレクトリに変更があった場合、対象ディレクトリをしっかりCOPYする必要がある。
↓
最初、/root /root のみを対象にしていたのだが、bundle install で /usr/local/bundle にインストールされるので、COPY対象外で、gemがないよと怒られた。
2. BuildKitの利用
-
何故?
~/.ssh/id_rsa
などの秘密鍵をコンテナ内に残さないようにするため -
やり方、方法
--mount=type=secret,id=ssh,target=/root/.ssh/id_rsa git clone
オプションをつけてgit cloneする
# Git
ARG SSH_PRIVATE_KEY
RUN mkdir /root/.ssh/
RUN touch /root/.ssh/id_rsa
RUN echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa
RUN touch /root/.ssh/known_hosts
RUN ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts
RUN chmod 600 /root/.ssh/*
# プロジェクトclone
WORKDIR /root/
RUN --mount=type=secret,id=ssh,target=/root/.ssh/id_rsa
RUN git clone [プロジェクト]
RUN rm /root/.ssh/id_rsa #→ rm しないと残ったままっぽい
↓
$ docker build -t yaga0429/ruby-chromedriver --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" --no-cache
まとめ
ECRとかでimageをプライベートに管理してたりすると、あんま気にならないのかな。
その辺はいまいちわからんけど、なんとなくスッキリしたのでオーケー。
まぁやってみたので忘れないうちに。