Linux docker exec的标准输出记录在docker容器内的文件中
我目前正在从主机(Linux Redhat)运行一个cronjob,在docker容器中执行一个脚本。我遇到的问题是,当我将标准输出重定向到docker容器中具有路径的文件时,cronjob抛出了一个异常,基本上是说找不到日志文件的路径。但是,如果我将输出日志文件路径更改为主机上的路径,则可以正常工作 下面的代码不起作用Linux docker exec的标准输出记录在docker容器内的文件中,linux,docker,cron,Linux,Docker,Cron,我目前正在从主机(Linux Redhat)运行一个cronjob,在docker容器中执行一个脚本。我遇到的问题是,当我将标准输出重定向到docker容器中具有路径的文件时,cronjob抛出了一个异常,基本上是说找不到日志文件的路径。但是,如果我将输出日志文件路径更改为主机上的路径,则可以正常工作 下面的代码不起作用 0 9 * * 1-5 sudo docker exec -i /path/in/docker/container/script.sh > /path/in/docker
0 9 * * 1-5 sudo docker exec -i /path/in/docker/container/script.sh > /path/in/docker/container/script.shout
但这个有效
0 9 * * 1-5 sudo docker exec -i /path/in/docker/container/script.sh > /path/in/host/script.shout
如何使第一个cronjob工作,以便使用docker容器中的路径将输出文件保存在docker容器中
我不想以
root
的身份运行cronjob,这就是为什么我需要在docker exec
之前运行sudo
。请注意,只有root
可以访问主机中的docker卷路径,这就是我也不能使用docker卷路径的原因。我宁愿尝试将重定向路径作为脚本的参数进行路径设置(因此删除“
”),并使脚本本身将其输出重定向到该参数文件
由于脚本是在docker容器中执行的,因此它将看到该路径(与cron作业相反,后者默认看到主机路径)cron使用shell运行命令,因此输出重定向由在主机上运行的shell处理,而不是在容器内。要让这样的shell命令在容器内运行,需要将shell作为docker命令运行,并转义或引用这些shell选项中的任何一个,以避免在容器内之前对它们进行解释。例如
0 9 * * 1-5 sudo docker exec -i container_name /bin/sh -c \
"/path/in/docker/container/script.sh > /path/in/docker/container/script.shout"
我们可以使用bach-c
并将重定向命令放在双引号之间,如下命令所示:
docker exec ${CONTAINER_ID} bash -c "./path/in/container/script.sh > /path/in/container/out"
- 我们必须确保
/path/in/container/script.sh
是一个可执行文件,可以从容器中使用以下命令:
- 或者使用主机上的以下命令:
您可以使用tee
:一个程序,它读取stdin并将其写入stdout和指定为arg的文件
echo 'foo' | tee file.txt
将在file.txt中写入文本“foo”
您需要的命令变成:
0 9 * * 1-5 sudo docker exec -i /path/in/docker/container/script.sh | tee /path/in/docker/container/script.shout
缺点是,您还可以转储到stdout。
您可以检查进一步的可能性和解决方法。是通过在我的.sh
脚本的末尾添加exec>/path/to/output\u file/in/docker\u container 2>&1
来实现的吗?@user7799677是的,这就是想法。BMitch解决方案可能也能工作,但我喜欢用脚本管理容器路径,而不是在主机cron设置中公开和可见。选择了来自work但来自@VonC的解决方案的两个答案,因为它更干净(无需在cronjob行中添加任何内容)
echo 'foo' | tee file.txt
0 9 * * 1-5 sudo docker exec -i /path/in/docker/container/script.sh | tee /path/in/docker/container/script.shout