Dockerfile 行中
tee
的用途是什么,例如:
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null
我熟悉
... | sudo tee file >/dev/null
形式的构造,但由于整个过程都是作为 root 运行的,所以这里不需要 sudo
,而且在 sudo
之前确实没有 tee
。它也不会将输出复制到 stdout,因为 stdout 被转储到 /dev/null
。
那么为什么不这样做呢:
RUN curl ... | gpg --dearmor > /etc/apt/keyrings/yarn.gpg
注意:我注意到,在那个特定的 Dockerfile 中,
tee
仅在从 gpg --dearmor
进行管道传输后使用。其他文件直接写成... > file
。 gpg --dearmor
可能与为什么需要 tee
有关吗?
如果我理解正确的话,https://dl.yarnpkg.com/debian/pubkey.gpg已被删除并保存到/etc/apt/keyrings/yarn.gpg?
正如你所说,
.... | gpg --dearmor > /etc/apt/keyrings/yarn.gpg
也应该有效。很可能有人复制了您所知道的 ... | sudo tee file >/dev/null
形式并删除了 sudo,因为他们认为它是不必要的,但没有多加考虑,也没有意识到 T 恤也是不必要的。
类似:
好的,我需要这个
*复制粘贴*
但是如果没有 sudo,它已经以 root 身份运行了
*删除 sudo*
我认为你不需要想太多。
还值得注意的是,即使你需要 sudo,也可能没有必要使用 tee,因为 gpg 有一个
--output file
/ -o file
选项。
curl "$url" | gpg --dearmor | sudo tee "$file" >/dev/null
和
curl "$url" | sudo gpg -o "$file" --dearmor >/dev/null
会生成相同的文件。