Dockerfile : 實(shí)現(xiàn)多行Shell的語(yǔ)法, 告別 && 鏈接符
大家好, 我是 老麥, 一個(gè)運(yùn)維老兵, 現(xiàn)在專注于 Golang,DevOps,云原生基礎(chǔ)設(shè)施建設(shè)。
Dockerfile : 實(shí)現(xiàn)多行Shell語(yǔ)法, 告別 && 鏈接符
圖片
建議點(diǎn)擊 查看原文 查看最新內(nèi)容。
原文鏈接: https://typonotes.com/posts/2023/09/01/dockerfile-buildkit-here-syntax/
今天在看 docker 文檔的時(shí)候, 發(fā)現(xiàn)了一個(gè)新語(yǔ)法 Dockerfile - here documents 語(yǔ)法[1], 即 多行語(yǔ)法。在 Dockerfile 1.4 中添加。
如果你知道 cat 的 here document 語(yǔ)法, 就會(huì)很好理解。
cat > demo.txt <<EOF
> 123
> asdb
> EOF
該語(yǔ)法在使用時(shí)有一些限制條件
- 該語(yǔ)法只支持在 RUN 和 COPY 下使用。
- 需要通過(guò) buildkit 解析語(yǔ)法。簡(jiǎn)單的說(shuō), 就是 docker buildx build 構(gòu)建鏡像
Here-Doc 語(yǔ)法介紹
這是一個(gè)特性語(yǔ)法, 必須在 Dockerfile 申明 # syntax=docker/dockerfile:1 , 否則即使使用 buildkit 也無(wú)法解析。
# syntax=docker/dockerfile:1
其他
1. RUN
# syntax=docker/dockerfile:1
FROM debian
RUN <<EOT bash
set -ex
apt-get update
apt-get install -y vim
EOT
注意:EOT 只是一個(gè)標(biāo)識(shí)符, 可以換成其他任意的符號(hào), 只要 成對(duì) 即可。例如 PANDA
2. COPY
# syntax=docker/dockerfile:1
FROM alpine
COPY <<-"EOT" /app/script.sh
echo hello ${FOO}
EOT
RUN FOO=abc ash /app/script.sh
注意:這里使用的是符號(hào) <<-
使用 buildx 執(zhí)行
還是很簡(jiǎn)單的, 直接使用 docker buildx build 就行了
例如:
docker buildx build \
-t example.com/debian:here \
-f here.Dockerfile \
.