首页 > 解决方案 > 启动 Docker 容器后保存 Dockerfile 中的 bash 命令输出

问题描述

我有一个以 ubuntu 映像为基础的 Dockerfile。

FROM ubuntu
ARG var_name
ENV env_var_name=$var_name
ENTRYPOINT ["/bin/bash", "-c", "echo $env_var_name"]

我期待从这个

  1. 执行一个简单的 bash 脚本,它将从用户键盘输入中获取一个环境变量,并在运行 docker 容器后输出该值。它是正确的。

  2. (我有问题的部分)在每次运行后将环境变量的值docker run --rm -e env_var_name=%valueOfVar% IMAGE-NAME保存到文件 + 中,我可以看到从键盘值输入的列表。

我对第 2 部分的想法是这样的 docker run --rm -e env_var_name=%valueOfVar% IMAGE-NAME > /directory/tosave/values.txt。这有效,但只保存最后一个值,而不是值列表。

如何更改 Dockerfile 以将值保存到文件中,Docker 将看到该文件以及运行后从哪个 Docker 读取和输出值?可能我不应该使用 ENTRYPOINT 吗?

感谢任何可能的帮助。我卡住了。

强调预期的环境变量的输出和保存。

标签: bashdockerdockerfile

解决方案


就像@lojza 所暗示的那样,>覆盖文件而>>附加到它们,这就是为什么您的命令正在破坏文件而不是添加文件的原因。所以你可以用这个来修复它:

docker run --rm -e env_var_name=%valueOfVar% IMAGE-NAME >> /directory/tosave/values.txt

或使用tee(1)

docker run --rm -e env_var_name=%valueOfVar% IMAGE-NAME | tee -a /directory/tosave/values.txt

不过要澄清一下,docker容器没有写入values.txt,您的shell是将docker run命令的输出重定向到文件的原因。如果您希望文件由 docker写入,您应该使用容器将文件或目录挂载到其中,-v并在那里重定向 echo 的输出。这是一个例子:

FROM ubuntu
ARG var_name
ENV env_var_name=$var_name
ENTRYPOINT ["/bin/bash", "-c", "echo $env_var_name | tee -a /data/values.txt"]

然后像这样运行它:

$ docker run --rm -e env_var_name=test1 -v "$(pwd):/data:rw" IMAGE-NAME
test1
$ docker run --rm -e env_var_name=test2 -v "$(pwd):/data:rw" IMAGE-NAME
test2
$ ls -l values.txt 
-rw-r--r-- 1 root root 12 May  3 15:11 values.txt
$ cat values.txt
test1
test2

还有一件事值得一提。 echo $env_var_name正在打印名称为字面意思的环境变量的值env_var_name。例如,如果您使用它运行容器,-e env_var_name=PATH它将打印文字字符串PATH而不是$PATH环境变量的值。这似乎是理想的结果,但我认为值得明确说明这一点。


推荐阅读