Python arroja KeyError al exportar variables de entorno

Python arroja KeyError al exportar variables de entorno

Tengo un caso extraño en el que tengo un archivo secret.env donde configuro todas mis variables de entorno como tal:

secreto.env

export TWITTER_CONSUMER_KEY="something"
export TWITTER_CONSUMER_SECRET="something"

Luego construí un archivo acoplable para exportar todas las variables y ejecutar la aplicación como tal:

FROM python:3.8-slim-buster

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install the dependencies
RUN pip install -r requirements.txt

RUN find . -name \*.pyc -delete

# Export all variables
RUN /bin/bash -c "source secret.env";

# tell the port number the container should expose
EXPOSE 8083

# run the command
ENTRYPOINT ["python", "run.py"]

Sin embargo, esto arroja un error clave:

$ docker run --name fortweet --rm -i -t fortweet:latest bash
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import socketio, app
  File "/app/app/__init__.py", line 65, in <module>
    app = create_app()
  File "/app/app/__init__.py", line 38, in create_app
    my_settings = settings.TwitterSettings.get_instance()
  File "/app/app/setup/settings.py", line 47, in get_instance
    TwitterSettings()
  File "/app/app/setup/settings.py", line 14, in __init__
    self.consumer_key = os.environ["TWITTER_CONSUMER_KEY"]
  File "/usr/local/lib/python3.8/os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'TWITTER_CONSUMER_KEY'

Cuando ejecuto esto en mi Windows, ¡funciona bien!

Alguien puede ayudarme con esto ?

Respuesta1

Cambie la línea final a:

ENTRYPOINT ["/bin/bash", "-c", "source secret.env ; python run.py"]

en su lugar, y elimine el RUNlugar donde está realizando el abastecimiento. Ver tambiénhttps://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/para obtener una explicación de la diferencia entre RUN, CMDy ENTRYPOINT.

En una palabra:

  • RUN ejecuta comandos en una nueva capa y crea una nueva imagen. Por ejemplo, se utiliza a menudo para instalar paquetes de software.
  • CMD establece comandos y/o parámetros predeterminados, que se pueden sobrescribir desde la línea de comandos cuando se ejecuta el contenedor acoplable.
  • ENTRYPOINT configura un contenedor que se ejecutará como ejecutable.

No soy un experto en Docker, pero lo he usado en mi trabajo varias veces, así que tengo algunos conocimientos básicos. Creo que la razón por la que esto funciona es por las capas y, lo que es más importante, porque la acción de obtener variables de entorno se realiza exclusivamente en el ámbito de la memoria, no en el almacenamiento en disco. Entonces, abastecerse bajo un RUN en realidad no logra nada. Debe obtenerlos en el punto de ejecución de su aplicación real, razón por la cual la solución ENTRYPOINT anterior funciona, porque invocamos BASH, obtenemos las variables en el entorno y luego bifurcamos su aplicación Python, todo bajo el mismo shell. en el momento de la ejecución.

Sin embargo, esto todavía no explica por qué funciona en su entorno de Windows; sospecho que tiene las variables de entorno configuradas en algún lugar de su entorno de Windows, por lo que ha funcionado para usted, pero no por la razón que cree.

información relacionada