Dockerfile: 通过 buildkit 支持多行语法

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2023/09/01/dockerfile-buildkit-here-syntax/

今天在看 docker 文档的时候, 发现了一个新语法 Dockerfile - here documents 语法 , 即 多行语法。 在 Dockerfile 1.4 中添加。

如果你知道 cat 的 here document 语法, 就会很好理解。

1
2
3
4
cat > demo.txt <<EOF
> 123
> asdb
> EOF

该语法在使用时有一些限制条件

  1. 该语法只支持在 RUNCOPY 下使用。
  2. 需要通过 buildkit 解析语法。 简单的说, 就是 docker buildx build 构建镜像

Here-Doc 语法介绍

这是一个特性语法, 必须在 Dockerfile 申明 # syntax=docker/dockerfile:1 , 否则即使使用 buildkit 也无法解析。

1
2
3
# syntax=docker/dockerfile:1

其他

1. RUN

1
2
3
4
5
6
7
# syntax=docker/dockerfile:1
FROM debian
RUN <<EOT bash
  set -ex
  apt-get update
  apt-get install -y vim
EOT

注意: EOT 只是一个标识符, 可以换成其他任意的符号, 只要 成对 即可。 例如 PANDA

2. COPY

1
2
3
4
5
6
# syntax=docker/dockerfile:1
FROM alpine
COPY <<-"EOT" /app/script.sh
	echo hello ${FOO}
EOT
RUN FOO=abc ash /app/script.sh

注意: 这里使用的是符号 <<-

使用 buildx 执行

还是很简单的, 直接使用 docker buildx build 就行了

例如:

1
2
3
4
docker buildx build \
    -t example.com/debian:here \
    -f here.Dockerfile \
    .

总结

有一点用。 但并没有太大的意义。