我正在编写一个dockerfile,并希望将“ls”命令的输出放入变量中,如下所示:
$file = ls /tmp/dir
这里,“dir”里面只有一个文件。
dockerfile中的以下RUN指令无法正常工作
RUN $file = ls /tmp/dir
答案 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中创建的file1
和file2
的列表):
$ 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)