【问题标题】:How to write docker cron logs to stdout/stderr如何将 docker cron 日志写入 stdout/stderr
【发布时间】:2019-12-11 14:26:22
【问题描述】:

我有运行 cron 的 docker CMD ["cron","-f"] 命令。这会将输出写入 cron 日志文件。

有没有办法将这些日志重定向到控制台。

我的基本图像看起来像

FROM ubuntu:latest
RUN ls

RUN apt-get update
RUN apt install -y software-properties-common
RUN add-apt-repository -y ppa:openjdk-r/ppa
RUN apt-get update
RUN apt-get install -y openjdk-12-jre

RUN apt-get -y install cron wget unzip



RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \
    && apt-get update -qqy \
    && apt-get -qqy install google-chrome-stable \
    && rm /etc/apt/sources.list.d/google-chrome.list \
    && rm -rf /var/lib/apt/lists/* /var/cache/apt/* \
    && sed -i 's/"$HERE\/chrome"/"$HERE\/chrome" --no-sandbox/g' /opt/google/chrome/google-chrome


ARG CHROME_DRIVER_VERSION=76.0.3809.68
RUN wget --no-verbose -O /tmp/chromedriver_linux64.zip https://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip \
    && rm -rf /opt/chromedriver \
    && unzip /tmp/chromedriver_linux64.zip -d /opt \
    && rm /tmp/chromedriver_linux64.zip \
    && mv /opt/chromedriver /opt/chromedriver-$CHROME_DRIVER_VERSION \
    && chmod 755 /opt/chromedriver-$CHROME_DRIVER_VERSION \
    && ln -fs /opt/chromedriver-$CHROME_DRIVER_VERSION /usr/bin/chromedriver

COPY tests-cron /etc/cron.d/tests-cron
RUN chmod 0644 /etc/cron.d/tests-cron
WORKDIR /etc/cron.d
RUN ls
RUN crontab /etc/cron.d/tests-cron

RUN touch /var/log/cron.log



WORKDIR /app
RUN mkdir pricetest

COPY --from=maven-container /app/ pricetest/
RUN cp /usr/bin/chromedriver ./pricetest

WORKDIR /app/pricetest
ENV SHELL=/bin/bash

CMD ["cron", "-f"]

PS:我仍在进行这个项目。所以我还没有优化 docker build。

我的 cronfile (tests-cron) 包含

* * * * * root echo "Hello world"

使用的基础图片:ubuntu:latest

【问题讨论】:

    标签: docker cron stdout


    【解决方案1】:

    是的,有一种方法可以将日志重定向到控制台,您只需更改 Dockerfile 的入口点。这是基于 alpine 的工作示例,它每分钟运行一个 cronjob 并输出。

    阿尔卑斯山图片

    CMD 标志

    -f  Foreground
    -L FILE Log to FILE
    

    Dockerfile

    FROM alpine:latest
    RUN echo "* * * * * echo hello" | crontab - 
    CMD ["crond","-f", "-L", "/dev/stdout"]
    

    另外,请始终分享您的基础图片,以便于理解问题的背景。

    Ubuntu 映像

    ubuntu 中的解决方法是稍微替换CMD,但我不会推荐这种方法,因为 cron 不会是容器的父进程。您可以阅读有关此方法的更多信息 herehere

    如果你想优化,那么使用 alpine docker 容器的未来镜像,这里是这两个镜像的大小差异。

    Alpine 只有 5MB,而 Ubuntu 是 91MB

    这是使用基本映像 Ubuntu 输出的 cron 工作示例

    FROM ubuntu:latest
    RUN apt-get update &&  apt-get -y install cron
    RUN touch /var/log/cron.log
    RUN (crontab -l ; echo "* * * * * echo "Hello world" >> /var/log/cron.log") | crontab
    CMD cron && tail -f /var/log/cron.log
    

    【讨论】:

    • 我已经用我的 docker 文件信息和基本图像@adiii 更新了这个问题
    • 这个 ubuntu 版本会不会把 o/p 写到 stdout @adii
    • o/p?是的,这个版本将日志写入标准输出。你可以试试这个简单的例子,它的工作原理和 alpine 一样。
    • Ubuntu 版本会创建 I/O 操作,只要容器在运行,日志就会增加。
    • @Terel 您可以在 docker run 命令或 docker-compose 中设置日志轮换
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2019-03-29
    • 1970-01-01
    • 2022-12-07
    • 2010-09-26
    相关资源
    最近更新 更多