crontab任务python程序如何读取docker-compose里的environment变量
crontab任务python程序能否直接读取docker-compose里的environment变量?
我知道在不使用crontab下,可以用os.getenv(变量名)来引入,但如果使用crontab情况下该怎么引入呢?
文件目录
.
├── deploy
│ ├── crontab
│ ├── docker-compose.yml
│ └── Dockerfile
└── demo.py
docker-compose.yml
version: '3.5'
services:
demo:
build:
context: ..
dockerfile: ./deploy/Dockerfile
container_name: demo
restart: always
volumes:
- $HOME/logs:/work/logs
environment:
- PROD=1
- MYSQL_HOST=127.0.0.1
- MYSQL_DATABASE=demo
- MYSQL_USER=user_name
- MYSQL_PASSWORD=password
- REDIS_HOST=127.0.0.1
Dockerfile
FROM python:3.6.9-slim-buster
WORKDIR /work
RUN apt-get -y update && apt-get -y upgrade \
&& apt-get install -y cron \
&& apt-get clean && \
rm -rf /var/lib/apt/lists/* \
&& touch /var/log/cron.log \
&& mkdir -p /work/logs
ADD . /work
COPY ./deploy/crontab /etc/cron.d/cjob
RUN chmod 0644 /etc/cron.d/cjob
ENV PYTHONUNBUFFERED 1
CMD cron -f
crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * root python /work/demo.py >> /work/logs/demo.log 2>&1
demo.py
import os
import datetime
print('PROD: ', os.getenv('PROD'))
print(f"## {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"MYSQL_HOST: {os.getenv('MYSQL_HOST')} REDIS_HOST: {os.getenv('REDIS_HOST')}")
实际输出:
PROD: None
## 2021-02-05 17:53:01
MYSQL_HOST: None REDIS_HOST: None
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题终于解决了。
crontab
的环境变量与系统的环境变量确实不一样,如此解决思路便是使其所在环境变量一致即可。打印
crontab
环境变量:可以看出两者环境变量确实不一样:
解决方案是让
shell
包裹python
程序,然后用crontab
调度shell
脚本。其中
shell
需要引入系统的环境变量:crontab
调度shell
脚本:如此python便能正常引入环境变量
参考链接:
https://www.tony-yin.site/2018/10/29/Why-Crontab-Not-Work/#footer
https://www.cnblogs.com/xuxinkun/p/10531091.html
如果只是读取镜像中的 env, 你找个能解析 yml 格式的库, 读
docker-compose.yml
文件就行如果读运行中的容器内的环境变量, 就用
docker exec
方法比如容器名叫
workspace-centos
就执行: