いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Dockerfileでヒアドキュメントの利用 (syntax, docker/dockerfile:1-labs)

概要

f:id:gsf_zero1:20211029114204p:plain

よく忘れるので、ここにメモメモ。。。

最近のDockerfileでは シェルスクリプト のようにヒアドキュメントが使えるようになっています。

使うためには条件があって、

  • DOCKER_BUILDKIT が有効になっている
  • Dockerfileのシンタックスバージョンが docker/dockerfile:1.3-labs 以降

ということになっています。

BUILDKITに関しては

devlights.hatenablog.com

を参照ください。

Dockerfileのシンタックスバージョンというのは、Dockerfileの先頭に「どのバージョンのDockerfileスペックを適用するか」を明示することです。

docs.docker.jp

ヒアドキュメント機能は、シンタックスバージョン 1.3-labs 以降が必要なので、以下のように指定します。

# syntax=docker/dockerfile:1-labs
FROM golang:1.17-alpine

ヒアドキュメントが使える場合、DockerfileでRUN命令を書く場合にすごく見やすくなるので個人的に好きです。

イメージをビルドする場合は、以下のどれかで行います。

  • BUILDKITが既に有効な場合
    • 普通に docker image build -t xxx ${PWD} でビルド出来ます
  • BUILDKITが有効でない状態
    • DOCKER_BUILDKIT=1 docker image build -t xxx ${PWD} でビルド出来ます
  • DOCKER_BUILDKIT が有効かどうかわからん
    • docker buildx build -t xxx ${PWD} でビルド出来ます(Docker自身のバージョンが古いと無理かも)

サンプル

# syntax=docker/dockerfile:1-labs
FROM golang:1.17-alpine

RUN <<EOF
    apk add --no-cache make gcc libc-dev musl-dev
    go install github.com/go-delve/delve/cmd/dlv@latest
EOF

WORKDIR /workspace
build:
  docker buildx build -t godev -f Dockerfile ${PWD}

run:
  docker container run \
      --init \
      --interactive \
      --tty \
      --rm \
      godev

実行してちゃんとビルドできるかを確認してみます。

$ make build
docker buildx build -t godev -f Dockerfile /workspaces/try-docker/heredocs_in_dockerfile
[+] Building 32.3s (13/13) FINISHED                                                                                                                                                                  
 => [internal] load build definition from Dockerfile
 => [internal] load .dockerignore
 => resolve image config for docker.io/docker/dockerfile:1-labs
 => [auth] docker/dockerfile:pull token for registry-1.docker.io
 => [internal] load .dockerignore 
 => [internal] load build definition from Dockerfile
 => [internal] load metadata for docker.io/library/golang:1.17-alpine
 => [auth] library/golang:pull token for registry-1.docker.io
 => [1/3] FROM docker.io/library/golang:1.17-alpine@sha256:4918412049183afe42f1ecaf8f5c2a88917c2eab153ce5ecf4bf2d55c1507b74
 => [2/3] RUN <<EOF (apk add --no-cache make gcc libc-dev musl-dev...)
 => [3/3] WORKDIR /workspace
 => exporting to image
 => => exporting layers

↑↑途中経過のログは割愛↑↑

ちゃんと => [2/3] RUN <<EOF (apk add --no-cache make gcc libc-dev musl-dev...) という部分でエラーにならずに実行されていますね。

参考情報


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com