docker容器cron任务读取环境变量

概述

​ 因为cron从非交互式、非登录 shell 运行作业。所以当cron执行作业时,它不会从~/.bashrc~/.bash_profile/etc/profile 等文件加载环境变量。当我们需要使用容器内的环境变量作为参数定时运行shell脚本时,由于无法读取环境变量导致运行失败。

以下为docker容器的解决方案

解决方案

  1. 保存容器环境变量(可以写在entrypoint中)

    通过declare命令和grep命令捕获你所需要的环境变量至/container.env文件中(当然,这个文件你可以随意定义)

    1
    declare -p | gerp -E 'VAR1|VAR2|VAR2' > /container.env
  2. 运行时载入环境变量配置文件

    有两种方式载入。

    1. 通过需要执行的shell脚本载入,只需在shell脚本前加入即可

      1
      2
      3
      4
      #!/bin/bash
      # 读取容器设定的环境变量
      source /container.env

    2. 直接在crontab中载入

      1
      2
      3
      SHELL=/bin/bash
      BASH_ENV=/container.env
      * * * * * root /test-cron.sh

cron注意事项

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量

  1. 脚本中涉及文件路径时写全局路径(如python 通过which python 定位其全局路径再填入)
  2. 脚本执行其他环境变量时,通过source命令引入环境变量
  3. 当手动执行脚本OK,但是crontab执行失败时。很有可能环境变量出问题