Dockerfile:将RUN指令输出到变量中

时间:2015-12-10 23:45:50

标签: docker dockerfile

我正在编写一个dockerfile,并希望将“ls”命令的输出放入变量中,如下所示:

$file = ls /tmp/dir

这里,“dir”里面只有一个文件。

dockerfile中的以下RUN指令无法正常工作

RUN $file = ls /tmp/dir

3 个答案:

答案 0 :(得分:25)

您无法保存变量以供以后在其他Dockerfile命令中使用(如果这是您的意图)。这是因为每个RUN都发生在一个新shell中。

但是,如果您只想捕获ls的输出,则应该能够在一个RUN复合命令中执行此操作。例如:

RUN file="$(ls -1 /tmp/dir)" && echo $file

或者只使用子shell内联:

RUN echo $(ls -1 /tmp/dir)

希望这有助于您理解。如果您有实际的错误或问题要解决,我可以扩展这个而不是假设的答案。

完整示例Dockerfile证明了这一点:

FROM alpine:3.7
RUN mkdir -p /tmp/dir && touch /tmp/dir/file1 /tmp//dir/file2
RUN file="$(ls -1 /tmp/dir)" && echo $file
RUN echo $(ls -1 /tmp/dir)

构建时,您应该看到步骤3和4输出变量(其中包含在步骤2中创建的file1file2的列表):

$ docker build --no-cache -t test .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM alpine:3.7
 ---> 3fd9065eaf02
Step 2/4 : RUN mkdir -p /tmp/dir && touch /tmp/dir/file1 /tmp//dir/file2
 ---> Running in abb2fe683e82
Removing intermediate container abb2fe683e82
 ---> 2f6dfca9385c
Step 3/4 : RUN file="$(ls -1 /tmp/dir)" && echo $file
 ---> Running in 060a285e3d8a
file1 file2
Removing intermediate container 060a285e3d8a
 ---> 2e4cc2873b8c
Step 4/4 : RUN echo $(ls -1 /tmp/dir)
 ---> Running in 528fc5d6c721
file1 file2
Removing intermediate container 528fc5d6c721
 ---> 1be7c54e1f29
Successfully built 1be7c54e1f29
Successfully tagged test:latest

答案 1 :(得分:0)

我无法让Andy(或任何其他)方法在Dockerfile本身中工作,因此我将Dockerfile入口点设置为包含以下内容的bash文件:

#!/bin/bash
file="$(conda list --explicit)" && echo $file
echo $(conda list --explicit)

请注意,第二种方法不会呈现换行符,因此我找到了第一种方法-通过$file变量echo-优越。

答案 2 :(得分:0)

我专门将它用于打印控制台颜色。 如果您的容器具有python,则可以执行以下操作:

python -c 'print(" \033[31m RED TEXT \033[0m ")'
python -c 'print(" \033[32m GREEN TEXT \033[0m ")'
python -c 'print(" \033[34m BLUE TEXT \033[0m ")'

enter image description here