【问题标题】:docker-compose with crontabdocker-compose 与 crontab
【发布时间】:2015-06-18 02:49:34
【问题描述】:

我最近想在crontab中执行docker-compose命令时遇到问题。

我有一个 docker-compose YAML 文件,它定义了我需要的所有服务,比如“docker-compose.yml”。我还有一个 Makefile,我在其中编写了一些命令来做某事。

我的makefile是:

.PHONY operate
operate:
    /usr/local/bin/docker-compose -p /project -f ~/docker-compose-production.yml run rails env

这使得脚本在 shell 中执行时运行良好。它列出了我在 docker-compose.yml 中定义的所有环境变量。但是当我把它放在 crontab 中时。 结果变得很奇怪,它只列出了$PATH

我的 crontab 文件是:

57 21 * * * make -f ~/Makefile operate  >~/temp 2>&1

我想肯定有一些环境变量是 docker-compose 必须有的,但我不知道。你对这个问题有任何想法吗?

【问题讨论】:

  • 您没有定义运行 cronjob 的用户,因此您需要使用绝对路径而不是 ~/

标签: crontab docker-compose


【解决方案1】:

你可以使用

10 3 * * 0 /usr/local/bin/docker-compose -f /www/ilanni.com/docker-compose.yml start > /dev/null

【讨论】:

    【解决方案2】:

    我在脚本中使用 docker-compose exec 命令的 bash 脚本出现问题,这可能与问题有关。

    脚本从终端启动时运行良好,但在 CRON 启动脚本时返回错误代码。

    我通过在 bash 脚本中的 docker-compose exec 之后添加 -T 解决了这个问题:

    docker-compose exec -T

    –T 禁用伪 tty 分配。默认情况下 docker-compose exec 分配一个 TTY。

    【讨论】:

      【解决方案3】:

      您不需要任何环境变量来驱动您尚未用于 Docker 的 Docker Compost。除非您连接到远程 Docker 主机,否则其中大部分都是不需要的。

      我怀疑 cron 是以不同的用户身份执行的,具有不同的权限集,无法访问 Docker 套接字。也许您可以在 Makefile 中添加一行以进行调试。您可以使用 'whoami' 命令输出当前用户的姓名。

      【讨论】:

      • 我尝试在 crontab 中使用 'whami'。用户和我在shell中使用的一样,用户是'root'。所以脚本获得了完成这项工作所需的所有权限。
      【解决方案4】:

      对我来说,问题在于路径设置不正确。检查您在 crontab 中的 PATH 环境变量是否与您当前用户的相同。

      【讨论】:

        【解决方案5】:

        我正在使用 WSL(Linux 的 Windows 子系统)crontab 在 Windows 10 上运行 docker-compose。 注意:使用https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly 获得 Docker Desktop for Windows 和 WSK 完美运行

        记录我如何运行 docker-compose 命令,以供可能遇到相同问题的其他人使用。

        # Setting environment for Docker
        DOCKER_HOST=tcp://localhost:2375
        # m h  dom mon dow   command
        01 01 * * * cd /d/my_docker_proj_dir && /home/my_user/.local/bin/docker-compose  exec -d container bash  -c "full-path-to-command args" 1> /tmp/cron.log 2> /tmp/cron.log
        

        【讨论】:

          【解决方案6】:

          对于 laravel 你可以试试:

          docker exec -i php php /var/www/html/artisan schedule:run
          

          【讨论】:

            【解决方案7】:

            我在 crontab 中的解决方案:

            */1 * * * * /usr/local/bin/docker-compose -f /home/mypath/docker-compose.yml exec php ls >/dev/null 2>&1 
            

            我的命令:ls

            我的服务容器:php

            【讨论】: