1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

「実行可能な Dockerfile」を作ってみる

Last updated at Posted at 2023-07-31

タイトルは「実行可能な Docker イメージ」の間違いではありません。「実行可能な Dockerfile」で正解です。実行するとこのようにイメージのビルドが走ります:

chmod +x Dockerfile
./Dockerfile

ExecutableDockerfile.gif

仕掛けは単純で、シバンで docker build を呼び出しているだけです:

#!/usr/bin/env -S docker build . -f
# syntax=docker/dockerfile:1.5.0
FROM busybox

Dockerfile は # で始まる行がコメントとして扱われるため、1 行目のコメントとしてシバンを仕込めるわけですね。

env コマンドの -S オプションはシバン行で複数の引数を渡すのに使用されます。このオプションを付加しないと docker build . -f で 1 コマンド扱いとなり No such file or directory となります。

/usr/bin/env: `docker build . -f': そのようなファイルやディレクトリはありません
/usr/bin/env: shebang 行でオプションを渡すには -[v]S を使ってください

docker build-f オプションは Dockerfile のパスを指定するものです。シバン行で指定されたインタプリタには実行されたファイルのパスが渡されるので、これを -f オプションで受けられる順番にしています。

syntax ディレクティブとの相性問題(解決済み)

このトリックは以前から使用可能だったのですが、syntax ディレクティブとの相性問題がありました。syntax ディレクティブは通常 1 行目にありますが、シバンを書くと 2 行目に移動してしまいます。この結果、Buildkit はその行を syntax ディレクティブではなく通常のコメントとして理解し、拡張構文が使用できない状態になってました。

この点について、2023-01-10 リリースの Dockerfile v1.5.0syntax ディレクティブの拡張が行われ、シバン行の次にある場合でも理解されるようになりました。同時に // syntax = ...{ "syntax": "..." } といった形式の表記も理解されるようになっています:

frontend/dockerfile/parser/directives.go
// DetectSyntax returns the syntax of provided input.
//
// The traditional dockerfile directives '# syntax = ...' are used by default,
// however, the function will also fallback to c-style directives '// syntax = ...'
// and json-encoded directives '{ "syntax": "..." }'. Finally, starting lines
// with '#!' are treated as shebangs and ignored.
//
// This allows for a flexible range of input formats, and appropriate syntax
// selection.

https://github.com/moby/buildkit/blob/dc706a966d050323082c44de9c5bfe49b7251191/frontend/dockerfile/parser/directives.go#L103-L111

Buildkit には同日リリースの v0.11.0 でビルトインされ、Docker Engine には 2023-05-17 リリースの v24.0 で取り込まれました。

Dockerfile が実行可能であることのメリットは正直あまりないですが、タグ等 docker build に渡してほしいオプションを明示する際には使えそうです:

#!/usr/bin/env -S docker build --no-cache --progress plain --tag tag --build-arg KEY=build-time . -f
# syntax=docker/dockerfile:1.5.0
FROM busybox

ARG KEY
RUN echo $KEY

なお、ARG についてはこんなことをしなくても ARG KEY=value形式でデフォルト値を明示可能です。

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?