具有标准输出的docker exec记录在docker容器

时间:2018-05-17 03:38:08

标签: 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/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,这就是我sudo之前需要docker exec的原因。请注意,只有root可以访问主机中的docker volume路径,这就是我无法使用泊坞窗卷路径的原因。

4 个答案:

答案 0 :(得分:2)

Cron使用shell运行您的命令,因此输出重定向由主机上运行的shell处理,而不是在容器内部。要使这样的shell命令在容器内运行,你需要运行一个shell作为docker命令,并转义或引用你的任何shell选项,以避免在你进入容器之前解释它们。 E.g。

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"

答案 1 :(得分:1)

我宁愿尝试将重定向路径作为参数路由到脚本(因此删除“>”),并使脚本本身将其输出重定向到该参数文件

由于脚本在docker容器中执行,它会看到该路径(而不是cron作业,默认情况下看到主机路径)

答案 2 :(得分:1)

我们可以使用bach -c并将重定向命令放在双引号之间,如下所示:

docker exec ${CONTAINER_ID} bash -c "./path/in/container/script.sh > /path/in/container/out"
  • 我们必须通过使用容器中的以下命令来确保/path/in/container/script.sh是可执行文件:
chmod +x /path/in/container/script.sh
  • 或通过从主机使用以下命令:
docker exec ${CONTAINER_ID} chmod +x /path/in/container/script.sh

答案 3 :(得分:0)

您可以使用 tee:读取标准输入并将其写入标准输出和指定为参数的文件的程序。

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

缺点是你也转储到标准输出。 您可以查看 this SO question 以了解更多可能性和解决方法。