【问题标题】:docker exec with standard output logged in a file inside the docker container带有标准输出的 docker exec 记录在 docker 容器内的文件中
【发布时间】:2018-10-27 05:19:10
【问题描述】:

我目前正在从主机 (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 volume 路径,这就是为什么我也不能使用docker 卷路径。

【问题讨论】:

  • 选择了来自工作的答案,但选择了来自@VonC 的解决方案,因为它更干净(无需在 cronjob 行上添加任何内容)

标签: linux docker cron


【解决方案1】:

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"

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是在我的.sh 脚本末尾添加exec > /path/to/output_file/in/docker_container 2>&1 吗?
    • @user7799677 是的,就是这个想法。 BMitch 解决方案也可能有效,但我喜欢使用脚本管理容器路径,而不是在主机 cron 设置中公开和可见。
    【解决方案3】:

    我们可以使用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
    

    【讨论】:

      【解决方案4】:

      您可以使用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 了解更多可能性和解决方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 2015-07-15
        • 2018-05-14
        • 1970-01-01
        • 2020-10-12
        • 2021-12-29
        • 2014-08-28
        相关资源
        最近更新 更多