linux - 带有标准输出的 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
,这就是为什么我需要sudo
before docker exec
。请注意,只能root
访问docker volume
主机中的路径,这就是为什么我也不能使用 docker 卷路径。
解决方案
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"
推荐阅读
- firebase - FIrebase firestore - 我应该如何每天更换整个收藏?
- javascript - 如何在反应中实现复选框(选中和未选中的功能)?
- python - 如何从函数中更改类中的值?
- python - 将自定义视图添加到 django 管理界面以添加更多功能
- php - 根据php数组显示页面内容
- http-headers - 即使我添加了正确的 SHA,也违反了 CSP
- ios - 如何使用日期对象(到 dd-MM-yyyy HH:mm:ss)在 Swift 的 NSPredicate 中使用它
- typescript - 有没有办法在 TypeScript 中递归地展开函数类型?
- pyspark - Pyspark:java.lang.ClassNotFoundException:找不到数据源:com.microsoft.sqlserver.jdbc.spark(SQL 数据池)
- c++ - “架构 x86_64 的未定义符号” - 再一次(小例子)