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
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:
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
env_file
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!