如何在Dockerfile中编写多行命令,同时保留新行?

Ven*_*nth 54 docker dockerfile

我想在Dockerfile中编写以下RUN命令.但是,docker并没有保留新的线条.

RUN echo "[repo] \
name            = YUM Repository \
baseurl         = https://example.com/packages/ \
enabled         = 1 \
gpgcheck        = 0" > /etc/yum.repos.d/Repo.repoxyz
Run Code Online (Sandbox Code Playgroud)

我知道\在每一行的末尾都会逃脱新行.但是,有什么方法可以写多行来保留新行吗?

Dan*_*nai 89

启动命令$',结束'并使用\n\换行符,如下所示:

RUN echo $'[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0' > /etc/yum.repos.d/Repo.repoxyz
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是:`$'... \n \`技术取决于docker`RUN`使用的shell是'bash`.在某些系统(例如Ubuntu)上,shell RUN使用的是`/ bin/sh`,它通常是`dash`的链接,它不是'bash`而且不理解`$'`语法. (18认同)
  • 请解释一下你在做什么,不要只是放弃一个不透明的解决方案 (13认同)
  • 它是bash语法.有关详细信息,请参阅此问题:http://stackoverflow.com/a/11966402/1395437 (4认同)
  • @Anon,它确实可以在使用 shell 的 Alpine linux(目前我使用的是 3.10.2)中工作。 (3认同)
  • 正如@Anon 所说,如果在 bash 之外的任何其他地方运行,这将不起作用。(在`Oh My Zsh` 中也不起作用) (2认同)
  • 它不适用于变量。 (2认同)

CTo*_*dea 34

我用过printf.使用"\n"在一行中写入所有文本.

执行:

RUN printf 'example \ntext \nhere' >> example.txt
Run Code Online (Sandbox Code Playgroud)

刀片:

example
text
here
Run Code Online (Sandbox Code Playgroud)

在example.txt中


rya*_*yan 22

从 Docker 18.09 和Dockerfile 语法 1.4开始,Dockerfile 原生支持heredocs(即您在这里寻找的内容)!

  1. 启用 BuildKit,例如通过设置DOCKER_BUILDKIT=1.
  2. 将此行添加到 Dockerfile 的顶部:
    # syntax=docker/dockerfile:1.4
    
    Run Code Online (Sandbox Code Playgroud) 或按照文档中的建议
    # syntax=docker/dockerfile:1
    
    Run Code Online (Sandbox Code Playgroud)
  3. 像这样重写你的定界符:
    COPY <<EOF /etc/yum.repos.d/Repo.repoxyz
    [repo]
    name            = YUM Repository
    baseurl         = https://example.com/packages/
    enabled         = 1
    gpgcheck        = 0
    EOF
    
    Run Code Online (Sandbox Code Playgroud)

您还可以使用它在单个块中运行多个 bash 命令RUN等。更多详细信息:Docker 博客文章Dockerfile 语法文档


Pau*_*lgo 10

您可以使用:

RUN echo -e "\
[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0\
" > /etc/yum.repos.d/Repo.repoxyz
Run Code Online (Sandbox Code Playgroud)

这样,您将可以快速查看文件内容。您只需要知道,您需要以每行结尾\\n在需要时插入。

  • 使用“-e”选项给了我意想不到的行为。该选项不会被本身解释,而是被解释为要打印的文本的一部分。 (7认同)
  • 这需要 `echo -e` 来解释 `\n` (2认同)

Ser*_*gey 9

我最终使用了上面列出的示例的组合,因为新行\n不适用于echo.

RUN printf 'example \n\
text \n\
here' >> example.txt
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它产生以下结果:

example
text
here
Run Code Online (Sandbox Code Playgroud)

  • 您的答案与 CTodea 的答案有何不同? (2认同)
  • @TheGodfather 这是一个多行示例。也更好地回答原来的问题。 (2认同)