Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux docker exec的标准输出记录在docker容器内的文件中_Linux_Docker_Cron - Fatal编程技术网

Linux docker exec的标准输出记录在docker容器内的文件中

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

我目前正在从主机(Linux Redhat)运行一个cronjob,在docker容器中执行一个脚本。我遇到的问题是,当我将标准输出重定向到docker容器中具有路径的文件时,cronjob抛出了一个异常,基本上是说找不到日志文件的路径。但是,如果我将输出日志文件路径更改为主机上的路径,则可以正常工作

下面的代码不起作用

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