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 RUN
lugar 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
, CMD
y 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.