Eu tenho um caso estranho em que tenho um arquivo secret.env onde defino todas as minhas variáveis de ambiente como tal:
secret.env
export TWITTER_CONSUMER_KEY="something"
export TWITTER_CONSUMER_SECRET="something"
Em seguida, criei um arquivo docker para exportar todas as variáveis e executar o aplicativo 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"]
No entanto, isso está lançando um erro de chave:
$ 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'
Quando eu executo isso no meu windows, funciona bem!
Alguém pode me ajudar com isso ?
Altere a linha final para:
em vez disso, e remova o
RUN
local onde você está realizando o fornecimento. Consulte também https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/ para obter uma explicação da diferença entreRUN
,CMD
eENTRYPOINT
.Eu não sou um especialista em docker, mas o usei no meu trabalho algumas vezes, então tenho algum conhecimento básico dele. Acho que a razão pela qual isso funciona é por causa das camadas e, mais importante, porque a ação de fornecer variáveis de ambiente é puramente apenas no domínio da memória, não no armazenamento em disco. Portanto, o fornecimento sob um RUN na verdade não alcança nada. Você precisa obtê-los no ponto de execução do seu aplicativo real, e é por isso que a correção ENTRYPOINT acima funciona, porque estamos invocando o BASH, fornecendo as variáveis no ambiente e, em seguida, bifurcando seu aplicativo python, tudo sob o mesmo shell, em tempo de execução.
No entanto, isso ainda não explica por que funciona em seu ambiente Windows - minha suspeita é que você tenha as variáveis de ambiente definidas em algum lugar em seu ambiente Windows, de modo que está funcionando para você, mas não pelo motivo que você acha que está.