Python 脚本在 docker 容器中找不到使用 CRON 运行的 ENV 变量

Posted

技术标签:

【中文标题】Python 脚本在 docker 容器中找不到使用 CRON 运行的 ENV 变量【英文标题】:Python script can't find ENV variable run with CRON in docker container 【发布时间】:2022-01-17 06:04:54 【问题描述】:

我想使用 crontab 在 Docker 容器中运行 Python 脚本,现在 cron 成功运行了 python 脚本,但它找不到从 Dockerfile 给出的 ENV 变量,当我从容器内部运行 echo $DOG 时,预期会显示字符串 "dog" 或者当 ik 手动运行 python 脚本/> python dog.py 时,它可以找到 ENV 变量。所以 ENV 在容器内的操作系统中。

为什么cron运行的脚本无法访问?

Crontab

* * * * * /usr/local/bin/python3 /app/dog.py > /proc/1/fd/1 2>/proc/1/fd/2
# empty line

Dockerfile

FROM python:3.10

RUN apt-get update && apt-get install -y cron

WORKDIR /app/

COPY crontab .

COPY dog.py .

RUN chmod -R 755 /app/

RUN crontab /app/crontab

CMD ["cron", "-f"]

狗.py

#!/usr/bin/python
import os
# Check os env variables
if "DOG" in os.environ:
    dog = os.environ.get("DOG")
    print(dog)
else:
    print("no env")

docker-compose.yaml

---
version: "3.8"
services:
  prd-workorder-worker:
    build: .
    environment:
    - DOG=dog

【问题讨论】:

似乎 cron 启动的进程正在使用另一个 ENV 运行...我将 cron -f 包装在一个 bash/sh 脚本中,该脚本首先记录 env var 或所有 ENV,同时你就是它,只是为了确保环境变量正确到达,然后启动cron -f。然后我会尝试从 python 或 cron 作业中的另一个脚本列出 ENV 中的所有内容并检查差异 【参考方案1】:

我通过运行一个 bash 脚本解决了这个问题,该脚本在容器启动时将所有变量放入 /etc/environment。

Dockerfile

...

CMD ["./entry.sh"]

entry.sh

#!/bin/bash

printenv | grep -v "no_proxy" >> /etc/environment

cron -f

【讨论】:

以上是关于Python 脚本在 docker 容器中找不到使用 CRON 运行的 ENV 变量的主要内容,如果未能解决你的问题,请参考以下文章

Docker - 在 docker 容器日志中找不到模块

在容器中找不到 Docker“/usr/bin/php”

在 docker php 容器中找不到 MySQLi

lsb_release:在最新的 Ubuntu Docker 容器中找不到命令

Docker容器启动时在jar中找不到api-rest的主类

Docker,MySQL - 在 .sh 文件中找不到命令