es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El script de Python no puede encontrar la variable de entorno al ejecutarse con CRON en un contenedor de Docker.

Quiero ejecutar un script de Python en un contenedor de Docker con crontab, ahora cron ejecuta correctamente el script de Python pero no puede encontrar la variable ENV proporcionada desde el Dockerfile, cuando ejecuto “echo $DOG” desde dentro del contenedor muestra la cadena esperada “dog” o cuando ejecuto manualmente el script de Python “/> python dog.py” puede encontrar las variables ENV. Entonces, las variables ENV están en el sistema operativo dentro del contenedor.

¿Por qué no son accesibles para el script ejecutado por cron?

Crontab

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

Línea vacía


Dockerfile ```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"]

dog.py


#!/usr/bin/python import os # Verificar las variables de entorno del sistema operativo 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
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el script que se ejecuta a través de cron no puede acceder a la variable de entorno establecida en el Dockerfile es porque cron se ejecuta en un contexto separado del shell donde se estableció la variable de entorno. Las variables de entorno establecidas en el Dockerfile son variables de entorno de tiempo de ejecución y no son accesibles por el proceso de cron.

    Para hacer que las variables de entorno sean accesibles por el proceso de cron, debes especificarlas en el archivo crontab. Entonces, para resolver este problema, puedes modificar el archivo crontab para incluir la variable de entorno de esta manera:

    DOG=dog
    * * * * * env DOG=$DOG /usr/local/bin/python3 /app/dog.py > /proc/1/fd/1 2>/proc/1/fd/2
    # línea vacía
    

    Esto hará que la variable de entorno DOG sea accesible para el script de Python que se ejecuta a través de cron.

    Como alternativa, también puedes definirlas en un archivo ENV separado y luego ejecutar el trabajo de cron con ese archivo. Así es cómo puedes modificar tu Dockerfile para usar un archivo ENV:

    Dockerfile

    FROM python:3.10
    
    RUN apt-get update && apt-get install -y cron
    
    WORKDIR /app/
    
    COPY crontab .
    
    COPY dog.py .
    
    COPY env_file .
    
    RUN chmod -R 755 /app/
    
    RUN env $(cat /app/env_file) crontab /app/crontab
    
    CMD ["cron", "-f"]
    

    env_file

    DOG=dog
    

    En este caso, las variables de entorno se definen en el archivo env_file y se pasan al comando crontab usando env $(cat /app/env_file).

    ¡Espero que esto te ayude!

Comments are closed.