【问题标题】:Save output of bash command from Dockerfile after Docker container was launched启动 Docker 容器后保存 Dockerfile 中的 bash 命令输出
【发布时间】:2021-07-26 00:40:47
【问题描述】:

我有一个以 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?

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

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

【问题讨论】:

  • 试试>>而不是>
  • 你得到的实际输出是什么?你希望它有什么不同?
  • @DavidMaze 例如,在输入命令时我使用 env_var_name=hello,所以运行docker run.... 后的输出(我在问题部分写了命令)将是你好。我的意思是你好将被保存到某个文件中。所以最后的文件将包含大量类型变量。

标签: bash docker dockerfile


【解决方案1】:

就像@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 环境变量的值。这似乎确实是理想的结果,但我认为值得明确说明这一点。

【讨论】:

  • /data:rw 是什么意思?我可以只使用数据或smth吗?
  • 这里是docs-v 参数采用冒号 (:) 分隔的 3 个部分。第一部分是要挂载的目录(在这种情况下是您的当前目录)。第二个是在容器中安装它的路径(我选择了/data——你可以做其他事情)。第三部分是以逗号分隔的选项列表,在本例中为 rw,它以读写模式安装卷(而不是说,ro 用于只读)。
猜你喜欢
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多