Dockerfile中RUN命令如何重定向STDOUT完成多文件拼接操作
问题原因说明
你当前遇到的报错是因为使用了RUN指令的exec格式([]包裹参数的写法),该模式不会调用shell解释器执行命令,因此>这类shell内置的重定向符号会被当作cat命令的普通文件参数处理,cat会尝试读取名为>/tmp/c的文件,自然会触发找不到文件的错误。
1. RUN命令中正确重定向STDOUT的方法
有两种可行写法:
- 直接使用RUN的shell格式,无需显式声明shell解释器,Docker会自动以
/bin/sh -c的模式执行命令,天然支持重定向语法:
RUN cat /tmp/a /tmp/b > /tmp/c
- 如果你需要坚持使用exec格式,可以手动指定shell解释器执行命令:
RUN ["sh", "-c", "cat /tmp/a /tmp/b > /tmp/c"]
2. 支持直接指定输出文件名的拼接命令
可以使用tee命令实现,该命令支持直接传入目标文件路径作为参数,将标准输入的内容同时输出到标准输出和指定文件中,如果不需要额外打印内容到标准输出,可以将标准输出重定向到/dev/null:
RUN cat /tmp/a /tmp/b | tee /tmp/c > /dev/null
该写法不需要依赖shell的重定向符来生成目标文件,符合你直接指定输出文件名的需求。
修正后的完整Dockerfile示例
COPY ./a /tmp COPY ./b /tmp RUN ["ls", "/tmp"] # 任选上述任意一种拼接写法即可,这里用shell格式举例 RUN cat /tmp/a /tmp/b > /tmp/c RUN ["ls", "/tmp"]
内容的提问来源于stack exchange,提问作者user1279887
相关产品推荐
相关产品推荐

