我目前正在运行一个来自主机(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
路径,这就是我无法使用泊坞窗卷路径的原因。
答案 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 以了解更多可能性和解决方法。