Dockerfile 支持内置Shell脚本, 从此告别
创始人
2025-07-01 08:11:22
0

前几天, 我测试 Dockerfile 的 Here-Doc 语法[1], 说其是 鸡肋语法, 是我 浅薄 了。

重新看了 docker 官网文档关于 buildkit[2] 的介绍, 从 docker engine 23.0 开始就是默认 builder 了。

BuildKitopen_in_new is an improved backend to replace the legacy builder. BuildKit is the default builder for users on Docker Desktop, and Docker Engine as of version 23.0.

换句话说, 我们上一篇文章说的的诸多不便, 都自然消失了。

之所以得出 HereDoc 是鸡肋语法 的 谬论, 我仔细分析了一下, 有以下几个原因。

我测试服务器上的 docker 版本过低, (20.x) 。

太久没写 基础镜像 了, 因此没有复杂的 RUN 和 COPY 命令。

基于以上几点, 我做了一些优化。

  1. 于是我根据官网文档,重新安装 docker engine, 将版本升级到了 24.0.5,
  2. 找到了在 Docker Hub 上的 redis 官方 dockerfile 重新测试。

得到的结论是, Here-Doc 语法真的是 太香了。

一句话总结:不仅指支持多行语法, 是直接支持内置 Shell 脚本

超级棒的 Dockerfile Here-Document Syntax 语法

首先, 按照官网文档将 docker engine 版本升到最新。以 ubuntu - docker[3] 为例

sudo apt-get install docker-ce docker-ce-cli containerd.io \
    docker-buildx-plugin docker-compose-plugin

其次, 在 Docker Hub 上找到对应的 redis 官方 dockerfile[4]

可以看到, RUN 内容虽然没有通过 && 链接, 但是都是使用 ; 和 \ 进行 分段,换行 管理的, 还是有一定不便。

稍微改造一下, (1) 删除所有 链接作用 的 ; \, (2) 取消 RUN 的所有缩进。 

划重点:这就是 一个Shell脚本 了。 换句话说, 在本地测试完成之后, 可以直接复制到  Dockerfile 中了。而之前, 还需要使用 && 链接整理命令。

注意: 这里必须使用以下格式, 否则 局部变量向下无法传递。

RUN <

直接使用 docker build 命令构建镜像, 看看执行结果

Troubleshooting

变量传递问题

关于以下两种模式, 官网文档并没有说明为什么。仅从对比实验效果上推测, 具体实现还没有研究。

模式1 bash 直接根在 EOT 后面。

RUN <

这种模式下, 第一行的变量 dist 在第二行 wget 中无法使用。因此 wget 行实际解析出来的命令为

wget -O example.com/app- app-

模式2, 在多行内容中 首行 指定解释器 #!/bin/bash, 则所有内容整体被看作一个 Shell 脚本。

RUN <

这种模式下, wget 行实际解析出来的命令为

wget -O example.com/app-Linux app-Linux

符合预期

没有 buildkit 配置文件

ls: cannot access '/root/.docker/buildx/instances/default': No such file or directory

找不到默认的 buildx 配置, 使用如下即可。

{
    "Name": "localbuilder",
    "Driver": "docker-container",
    "Nodes": [
        {
            "Name": "localbuilder0",
            "Endpoint": "unix:///var/run/docker.sock",
            "Platforms": [
                {
                    "architecture": "amd64",
                    "os": "linux"
                },
                {
                    "architecture": "arm64",
                    "os": "linux"
                }
            ],
            "Flags": null,
            "ConfigFile": "",
            "DriverOpts": {}
        }
    ],
    "Dynamic": false
}

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...