首页 > 解决方案 > 带有标准输出的 docker exec 记录在 docker 容器内的文件中

问题描述

我目前正在从在 docker 容器中执行脚本的主机(Linux Redhat)运行 cronjob。我遇到的问题是,当我将标准输出重定向到具有 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 容器中使用输出文件?

我不想运行 cronjob root,这就是为什么我需要sudobefore docker exec。请注意,只能root访问docker volume主机中的路径,这就是为什么我也不能使用 docker 卷路径。

标签: linuxdockercron

解决方案


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"

推荐阅读