189 8069 5689

Dockerfile支持内置Shell脚本,从此告别&&链接符号

Dockerfile 支持内置shell脚本, 从此告别 && 链接符号

作者:老麦 2023-09-12 09:13:24

云计算

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

前几天, 我测试 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
}



当前题目:Dockerfile支持内置Shell脚本,从此告别&&链接符号
浏览地址:http://cdxtjz.cn/article/coecssh.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。