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

最佳答案

如果只是读取镜像中的 env, 你找个能解析 yml 格式的库, 读 docker-compose.yml 文件就行

如果读运行中的容器内的环境变量, 就用 docker exec 方法
比如容器名叫 workspace-centos
就执行:

docker exec  workspace-centos env