Dockerfile のベストプラクティスを考える機会はありますが皆さんの意見も聞きたい。今回は噂の便利ツール、Open Interpreterのような外部コマンドをどんどん実行して環境を作り変えるようなタイプのツールの場合にはDockerはとても有用です。そのようなツールを利用する時のDockerfile について考えていきます。リポジトリは以下になります。
GitHub Actionsとの連携
GitHub Actionsは、CI/CD(継続的インテグレーションと継続的デリバリー)をGithub 上に簡単に実装できるツールです。今回は、trivy.ymlとdocker-publishを利用することで、セキュリティのスキャンとDockerイメージの自動公開が可能です。
trivy.ymlの利用
trivy.yml
は、Trivyという脆弱性スキャナーをGitHub Actionsで動かすための設定ファイルです。この設定を利用することで、Dockerイメージに存在するセキュリティの脆弱性を自動で検出できます。
docker-publishの追加
docker-publish
は、DockerイメージをDocker Hubや他のレジストリに自動で公開するためのGitHub Actionsのワークフローです。これにより、新しいバージョンのOpen Interpreterがリリースされた際に、手動でイメージをビルド・プッシュする手間が省けます。
Renovate.jsonの利用
renovate.json
は、依存関係を自動で更新する設定ファイルですが、これを使うとOpen Interpreterが依存しているライブラリやパッケージが新しくなったときに、自動でプルリクエストが作られるんです。そうすることで、いつも最新の状態を保てるわけですから、セキュリティリスクも減らせます。さらに、Pythonのパッケージも自動で更新したい場合は、requirements.txt
を使って設定しておくと便利です。これにより、Pythonの依存パッケージも最新の状態を維持できるようになります。
Dockerfileを書く際の注意点
私は以下のようなDockerfileを書きましたその際に以下のようなポイントを意識して書いたので参考にしてください。
軽量なベースイメージの使用
不必要なパッケージを含まない軽量なベースイメージを使用することで、ビルド時間とイメージサイズを削減できます。
FROM python:3.11
キャッシュの最適化
RUNコマンドを効率的に配置することで、Dockerキャッシュを最適化できます。
RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y --no-install-recommends git && \ rm -rf /var/lib/apt/lists/*
不必要なパッケージの削除
--no-install-recommends
オプションを使用して、不必要なパッケージをインストールしないようにします。
apt-get install -y --no-install-recommends git && \
作業ディレクトリの設定
WORKDIRを設定することで、その後のコマンドの実行ディレクトリを明示的に指定できます。
WORKDIR /root
機密情報はコンテナイメージに絶対に埋め込まない
社内で有識者へ投げたら機密情報をビルドイメージに追加することを指摘されたので運用時の手癖やミスで何処かのレイヤーに不用意に埋め込まないようにした github.com
まとめ
DockerでOpen Interpreterを運用する際には他にもいろいろ考えるべきことがあると思うので皆さんと議論したいのでIssue待ってます。