Dockerfile:将运行指令输出到变量中

Dockerfile:将运行指令输出到变量中,docker,dockerfile,Docker,Dockerfile,我正在编写dockerfile,希望将“ls”命令的输出放入一个变量中,如下所示: $file = ls /tmp/dir 这里,“dir”里面只有一个文件 dockerfile中的以下运行指令无效 RUN $file = ls /tmp/dir 不能保存变量以供以后在其他Dockerfile命令中使用(如果您有意这样做的话)。这是因为每次运行都发生在一个新的shell中 但是,如果您只想捕获ls的输出,您应该能够在一个RUN复合命令中完成。例如: RUN file="$(ls -1 /tm

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

$file = ls /tmp/dir
这里,“dir”里面只有一个文件

dockerfile中的以下运行指令无效

RUN $file = ls /tmp/dir

不能保存变量以供以后在其他
Dockerfile
命令中使用(如果您有意这样做的话)。这是因为每次运行
都发生在一个新的shell中

但是,如果您只想捕获
ls
的输出,您应该能够在一个
RUN
复合命令中完成。例如:

RUN file="$(ls -1 /tmp/dir)" && echo $file
或者只是使用子shell内联:

RUN echo $(ls -1 /tmp/dir)
希望这有助于你的理解。如果你有一个实际的错误或问题需要解决,我可以对此展开讨论,而不是假设的答案

演示这一点的完整示例是:

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中创建的
file1
file2
列表):

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

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

请注意,第二种方法不渲染换行符,因此我找到了第一种方法-通过
$file
变量-superior进行echo。

您可以共享整个dockerfile吗?这似乎没有为我打印任何东西。当然。我已经添加了一个示例
Dockerfile
并构建了演示。我也没有:
步骤10/20:运行文件=“$(conda list--explicit)”&&echo$file-->Using cache-->66f20d5489c0步骤11/20:运行echo$(conda list--explicit)-->Using cache-->f923669d8444
。缓存的步骤没有运行该命令。您需要在上一步中中断缓存,或者使用
--无缓存运行构建。对于我来说,我必须添加
--progress=plain
以查看
ls
输出。我有Docker v20.10.5.up投票支持sh文件的想法!注意,我的ubunutu上的任何一个都有换行符……但这是第二个问题。
#!/bin/bash
file="$(conda list --explicit)" && echo $file
echo $(conda list --explicit)