【问题标题】:How should I use libfaketime and cron in a Docker container?我应该如何在 Docker 容器中使用 libfaketime 和 cron?
【发布时间】:2021-03-04 17:04:53
【问题描述】:

我想设置一个 Docker 容器,它

  • 使用 libfaketime 伪造选定的日期;
  • 用那个假的时间运行一个 cron 作业。

我的尝试可以在https://gitlab.com/gablab/proto_docker_cron_libfaketime 找到。最相关的行可能是

# Dockerfile
CMD cron && tail -f /var/log/cron.log
# crontab_for_container
*  *  *  *  * for i in 1 2 3; do echo $i; flock -n /.flock_reprio /myscript.sh >> /var/log/cron.log 2>&1; sleep 10; done

更多详情

直接运行脚本

docker-compose exec myservice bash

然后bash /myscript.sh 给出想要的日期。 docker-compose exec myservice date 也一样。

Dockerfile

FROM debian:buster AS base


RUN set -ex;         \
    apt-get update;  

ADD ./myscript.sh /myscript.sh



RUN apt install -y cron
COPY ./crontab_for_container /etc/cron.d/crontab_for_container 
RUN chmod 0644 /etc/cron.d/crontab_for_container 
RUN crontab /etc/cron.d/crontab_for_container 
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log

from base as builder

# faketime
RUN apt-get update && apt-get install -y make gcc git 
# Get the sources and checkout at stable release 0.98
# see https://github.com/wolfcw/libfaketime/releases
RUN git clone https://github.com/wolfcw/libfaketime.git && \
    cd libfaketime && \
    git checkout dc2ae5eef31c7a64ce3a976487d8e57d50b8d594 && \
    make


from base as runtime

COPY --from=builder /libfaketime/src/libfaketime.so.1 /usr/local/lib 
ENV LD_PRELOAD=/usr/local/lib/libfaketime.so.1
ARG FAKETIME_ARG="0d"
ENV FAKETIME=$FAKETIME_ARG

【问题讨论】:

  • 请编辑问题以在问题本身中包含相关详细信息。您可以设置CMD flock -n /.flock_reprio /myscript.sh 直接运行命令而不涉及cron,或设置docker run your-image flock ... 覆盖容器在启动时运行的命令。
  • 你好@DavidMaze,我对使用 cron 运行这个命令特别感兴趣。但是,我编辑添加直接从 bash 运行脚本会产生预期的结果。你能更准确地说明我应该添加的细节吗?我将从 Dockerfile 开始。
  • 您包含的完整 Dockerfile 很有用,谢谢。

标签: docker time cron


【解决方案1】:

一个快速但有效的修复方法是将要传递给作业的变量硬编码到 crontab 文件中:

# crontab
*  *  *  *  * for i in 1 2 3; do echo $i;  LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME=FAKETIME_PLACEHOLDER TEST=ABCD flock -n /.flock_reprio /myscript.sh >> /var/log/cron.log 2>&1; sleep 10; done
# Dockerfile
RUN sed --in-place -e s/FAKETIME_PLACEHOLDER/"\"$FAKETIME_ARG\""/ /etc/cron.d/crontab_for_container

(请注意,需要引号 \",因为日期可以提供为“@2020-02-02 10:00:00”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2021-05-19
    • 2016-08-29
    相关资源
    最近更新 更多