在一个大型的官方镜像中 ,我通过 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,其回答如下:
- 开头的
|3是 YAML pipe operator,带一个strip chomping indicator. 在 Dockerfile 中用它可以写多行命令。 - 接下来是设置环境变量:
CUDA_VERSION=12.4.1.003CUDA_DRIVER_VERSION=550.54.15JETPACK_HOST_MOUNTS=(empty value)
- 然后再使用
/bin/sh -c执行以下判断脚本:if [ -n "${JETPACK_HOST_MOUNTS}" ]; thenecho "/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) - 如果变量非空:
- 创建/覆盖 (
>)/etc/ld.so.conf.d/nvidia-tegra.conf文件,基于/usr/lib/aarch64-linux-gnu/tegra中的内容 - 添加 (
>>)/usr/lib/aarch64-linux-gnu/tegra-egl文件的内容到上面的 conf 文件。
- 创建/覆盖 (
|3 代表下方各行的缩进列数。|3 代表 “保留所有换行,并缩进三格”。
所以这里提到了一个概念:YAML pip opertor 及其 strip chomping indicator。