bash - 启动 Docker 容器后保存 Dockerfile 中的 bash 命令输出
问题描述
我有一个以 ubuntu 映像为基础的 Dockerfile。
FROM ubuntu
ARG var_name
ENV env_var_name=$var_name
ENTRYPOINT ["/bin/bash", "-c", "echo $env_var_name"]
我期待从这个
执行一个简单的 bash 脚本,它将从用户键盘输入中获取一个环境变量,并在运行 docker 容器后输出该值。它是正确的。
(我有问题的部分)在每次运行后将环境变量的值
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 吗?
感谢任何可能的帮助。我卡住了。
强调预期的环境变量的输出和保存。
解决方案
就像@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
环境变量的值。这似乎是理想的结果,但我认为值得明确说明这一点。
推荐阅读
- python - ImportError:没有名为 _shim 的模块
- c# - 从“double”到“System.Runtime.Serialization.ISerializable”的装箱转换
- macos - Visual Studio Docker HTTPS 设置失败
- html - 如何在不中断新行的情况下保持列网格?
- shopify - 起始页上的捐款柜台
- kotlin - Kotlin:mutableList 应该声明为 Val 还是 Var?
- sql - 如果日期值在周末,则重置日期值
- jquery - Yii2:kartik-v/fileinput 在选择时触发上传
- database - 基于邮政编码的美国所有县的数据库
- java - 我对 ArrayList 作为 Hashtable 的值有疑问