如何使用Docker Heredocs向已有文件追加内容?
Docker Heredoc 追加内容到已有文件的正确方式
你用COPY <<EOF创建新文件的方式没问题,但COPY指令的heredoc语法不支持shell的重定向符号(比如>>),直接写COPY <<EOF >> ${USERHOME}/.bashrc会把>> ${USERHOME}/.bashrc当成完整的目标文件名,自然不会生效。
要实现追加内容到已有文件,得用RUN指令结合shell的heredoc语法,这里需要注意两个关键点:
- 嵌套heredoc时要使用不同的分隔符,避免shell提前结束输入
- heredoc的结束符必须顶格书写(如果用
<<-EOF可以允许缩进,但分隔符前只能用制表符,不能用空格)
正确示例1:嵌套分隔符写法
RUN <<EOF # 用EOC作为内层heredoc的分隔符,和外层EOF区分开 cat >> ${USERHOME}/.bashrc <<EOC # 以下是要追加的内容 export PATH=\$PATH:/custom/bin alias ll='ls -alh' EOC EOF
正确示例2:简化写法(推荐)
直接在RUN里用shell的heredoc追加,不需要嵌套Docker heredoc:
# 用单引号包裹EOF,避免Docker提前解析变量(如果需要保留变量原样) RUN cat >> ${USERHOME}/.bashrc <<'EOF' export PATH=$PATH:/custom/bin alias ll='ls -alh' EOF # 如果需要让shell解析变量(比如$USERHOME),去掉单引号即可 RUN cat >> ${USERHOME}/.bashrc <<EOF export PATH=\$PATH:${USERHOME}/.local/bin EOF
你之前报错的原因
你遇到的warning: here-document at line 1 delimited by end-of-file (wanted EOC')`错误,大概率是因为:
- 嵌套heredoc时用了相同的分隔符(比如内外层都用EOF),导致shell提前结束了内层输入
- heredoc的结束符没有顶格写,shell无法识别结束位置
内容的提问来源于stack exchange,提问作者René Link
相关产品推荐
相关产品推荐

