Dockerfile 中关于 RUN 的奇怪写法 -- 以 | 开头

在一个大型的官方镜像中 ,我通过 docker history --no-trunc <image_id> 看到,该镜像某一步的构建过程是:

RUN |3 CUDA_VERSION=12.4.1.003 CUDA_DRIVER_VERSION=550.54.15 JETPACK_HOST_MOUNTS= /bin/sh -c if [ -n "${JETPACK_HOST_MOUNTS}" ]; then        echo "/usr/lib/aarch64-linux-gnu/tegra" > /etc/ld.so.conf.d/nvidia-tegra.conf     && echo "/usr/lib/aarch64-linux-gnu/tegra-egl" >> /etc/ld.so.conf.d/nvidia-tegra.conf;  fi

这是一个很奇怪的写法,查了一下 Linux Shell 也没有以 “|” 开头的。
于是就去问了一下 Claude,其回答如下:

  1. 开头的 |3YAML pipe operator,带一个strip chomping indicator. 在 Dockerfile 中用它可以写多行命令。
  2. 接下来是设置环境变量:
    • CUDA_VERSION=12.4.1.003
    • CUDA_DRIVER_VERSION=550.54.15
    • JETPACK_HOST_MOUNTS= (empty value)
  3. 然后再使用 /bin/sh -c 执行以下判断脚本:
    if [ -n "${JETPACK_HOST_MOUNTS}" ]; then
        echo "/usr/lib/aarch64-linux-gnu/tegra" > /etc/ld.so.conf.d/nvidia-tegra.conf
        && echo "/usr/lib/aarch64-linux-gnu/tegra-egl" >> /etc/ld.so.conf.d/nvidia-tegra.conf
    fi
    

它实际的作用是:

  • 检查是否 JETPACK_HOST_MOUNTS 变量是为非空 (-n)
  • 如果变量非空:
    1. 创建/覆盖 (>) /etc/ld.so.conf.d/nvidia-tegra.conf 文件,基于 /usr/lib/aarch64-linux-gnu/tegra 中的内容
    2. 添加 (>>) /usr/lib/aarch64-linux-gnu/tegra-egl 文件的内容到上面的 conf 文件。

|3 代表下方各行的缩进列数。|3 代表 “保留所有换行,并缩进三格”。

所以这里提到了一个概念:YAML pip opertor 及其 strip chomping indicator。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值