在Dockerfile中迭代RUN命令

Max*_*ian 9 sh docker dockerfile

我有一行看起来像:

RUN for i in `x y z`; do echo "$i"; done
Run Code Online (Sandbox Code Playgroud)

......打算打印这三个项目中的每一个

但它提出了 /bin/sh: 1: x: not found

知道我做错了什么吗?

arj*_*bar 16

看起来你正在使用反引号.反引号中的内容会被执行,反引号中的文本会被结果返回的内容替换.

尝试使用单引号或双引号而不是反引号.

尝试摆脱这样的反引号:

RUN for i in x y z; do echo "$i"; done
Run Code Online (Sandbox Code Playgroud)


Tom*_*ang 10

我实际上会建议一个替代解决方案。

我们可以退后一步,而不是在 docker 文件中包含 LOOP...

在独立的 bash 脚本中实现循环;

这意味着你会有一个 loop.sh 如下:

#!/bin/bash

for i in $(seq 1 5); do echo "$i"; done

在您的 Dockerfile 中,只需执行以下操作:

RUN ./loop.sh

这样做的好处之一:

它只需要一步,这将花费你一层。您拥有的图层越少,您获得的图像尺寸就越小。

https://hackernoon.com/tips-to-reduce-docker-image-sizes-876095da3b34

  • 两种解决方案都只创建一层......无论你运行,循环与否,对 docker 都是透明的,并且总会创建一层。 (3认同)
  • 并且不要忘记,如果您记得使用“COPYloop.shloop.sh”将其从主机上下文复制到 docker 映像中,则只能执行“RUN ./loop.sh” (2认同)

小智 5

为了更易于维护Dockerfile,我的偏好是在RUN指令中使用多行带有注释,尤其是在将多个操作与&&

RUN sh -x \
    #
    # execute a for loop
    #
    && for i in x  \
                y  \
                z; \
       do \
              echo "$i"
       done \
    \
    #
    # and tell builder to have a great day
    #
    && echo "Have a great day!"
Run Code Online (Sandbox Code Playgroud)