私は以前「実行可能な Dockerfile」を作ってみるという記事を投稿しました。執筆にあたり Docker 関連のリポジトリ(buildkit, buildx 等)のリリースノートを確認していて、Git リポジトリを直接参照できるようになった旨の記載が複数ある事に気が付きました。あまり目立つ機能追加でないためかこの点にフォーカスした日本語記事を見た覚えがなかったので、本記事でメモを残すことにします。
Dockerfile の ADD コマンドで Git リポジトリを参照する
Dockerfile/1.5.0-labs より、ADD コマンドでソースとして Git URL を指定できるようになりました:
ADD [--keep-git-dir=<boolean>] <Git URL> <dir>
# syntax=docker/dockerfile:1.6.0
FROM debian:12-slim AS builder
# GitHubからGitのソースをADD
ADD https://github.com/git/git.git /tmp/src/
# Gitをソースからビルド
RUN <<EOF
# ビルドに必要なツールをインストール
apt-get update
apt-get install -y libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev g++ make autoconf
# ソースからインストール
cd /tmp/src/
make configure
./configure --prefix=/usr
make all
make install
# ゴミ掃除
apt-get clean
rm -rf /var/lib/apt/lists/*
rm -rf /tmp/src/
EOF
このように、コンテナイメージ内に Git がインストールされていない状態でもソースが取得できています。実際に便利そうなケースとしては、ビルドステージ等でリポジトリ上のソースからビルドしたい場合が当てはまりそうです。
docker build で Git リポジトリを参照する
また、buildx v0.9.0 からビルド時に Git リポジトリを指定できるようになっています:
docker build [OPTIONS] <Git URL>
# GitHub から「GitHub から Git のソースを ADD してソースからビルド」する Dockerfile を取得してビルド
docker build https://github.com/yokra9/docker-add-git-example.git#main:/
docker build
の場合は URL 指定の末尾でタグやブランチ、フォルダも指定できます。
URL 指定の末尾 | 参照するコミット | ビルドコンテキスト |
---|---|---|
myrepo.Git | refs/heads/master | / |
myrepo.Git#mytag | refs/tags/mytag | / |
myrepo.Git#mybranch | refs/heads/mybranch | / |
myrepo.Git#pull/42/head | refs/pull/42/head | / |
myrepo.Git#:myfolder | refs/heads/master | /myfolder |
myrepo.Git#master:myfolder | refs/heads/master | /myfolder |
myrepo.Git#mytag:myfolder | refs/tags/mytag | /myfolder |
myrepo.Git#mybranch:myfolder | refs/heads/mybranch | /myfolder |
CI でリポジトリ上の Dockerfile からビルドするケースでは便利に使えそうですね。
おまけ: URL からルート・ファイルシステムを読み込んでイメージを作成する
Docker イメージをスクラッチから作成する場合、ADD
コマンドで Tar 化したファイルシステムを取り込むのが定石のようです1 2:
FROM scratch
ADD rootfs.tar.xz /
CMD ["bash"]
FROM scratch
ADD alpine-minirootfs-3.19.0-x86_64.tar.gz /
CMD ["/bin/sh"]
ところで、docker import
はルート・ファイルシステムのアーカイブを元にイメージを作成できるコマンドですが、取得元として URL を指定できます。そのため、インターネットからルート・ファイルシステムのアーカイブを取得してイメージとして取り込むこともできます:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker import https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-minirootfs-3.19.0-x86_64.tar.gz -c "CMD sh" alpine
docker run --rm -it alpine
/ # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.19.0
PRETTY_NAME="Alpine Linux v3.19"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
ルート・ファイルシステムのアーカイブは各ディストリビューションのプロジェクトページからダウンロードできます:
もしルート・ファイルシステムのアーカイブを GitHub Releases に置くディストリビューションが出てくれば docker import
でも GitHub 上の資産を参照できますね。3 4
参考リンク
- Dockerfile reference | Adding a Git repository
ADD <git ref> <dir>
- dockerfile (labs): implement
ADD <git ref>
#2799 - dockerfile/1.5.0-labs
- Git URL
- Git のリモートとしてファイルシステム上のリポジトリを登録する
- build: allow external Dockerfile on remote context #994
- docker build | Git repositories
- docker import
-
https://github.com/debuerreotype/docker-debian-artifacts/blob/dist-amd64/bookworm/Dockerfile ↩
-
https://github.com/alpinelinux/docker-alpine/blob/v3.19/x86_64/Dockerfile ↩
-
GitHub 上でイメージを配布したいだけであればこんなトリッキーな手段でなく GitHub Packages Container registry (ghcr.io) をお勧めします。 ↩