모든 환경 변수를 다음과 같이 설정하는 secret.env 파일이 있는 이상한 경우가 있습니다.
비밀.env
export TWITTER_CONSUMER_KEY="something"
export TWITTER_CONSUMER_SECRET="something"
그런 다음 모든 변수를 내보내고 다음과 같이 앱을 실행하는 도커 파일을 만들었습니다.
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"]
그러나 이로 인해 중요한 오류가 발생합니다.
$ 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'
이것을 내 창에서 실행하면 잘 작동합니다!
누군가 저를 도와주실 수 있나요?
답변1
마지막 줄을 다음과 같이 변경합니다.
ENTRYPOINT ["/bin/bash", "-c", "source secret.env ; python run.py"]
대신 RUN
소싱을 수행하는 위치를 제거하세요. 또한보십시오https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/RUN
, CMD
및 의 차이점에 대한 설명입니다 ENTRYPOINT
.
간단히 말해서:
- RUN은 새 레이어에서 명령을 실행하고 새 이미지를 생성합니다. 예를 들어 소프트웨어 패키지를 설치하는 데 자주 사용됩니다.
- CMD는 docker 컨테이너가 실행될 때 명령줄에서 덮어쓸 수 있는 기본 명령 및/또는 매개 변수를 설정합니다.
- ENTRYPOINT는 실행 파일로 실행될 컨테이너를 구성합니다.
저는 도커 전문가는 아니지만 업무에 몇 번 사용해 봤기 때문에 이에 대한 기본적인 이해는 갖고 있습니다. 이것이 작동하는 이유는 계층화 때문이고, 더 중요한 것은 환경 변수 소싱 작업이 디스크 저장이 아닌 순수 메모리 영역에서만 수행되기 때문이라고 생각합니다. 따라서 RUN 하의 소싱은 실제로 아무것도 달성하지 못합니다. 실제 애플리케이션 실행 시점에 이를 소싱해야 합니다. 이것이 BASH를 호출하고 변수를 환경에 소싱한 다음 Python 애플리케이션을 모두 동일한 셸에서 포크하기 때문에 위의 ENTRYPOINT 수정이 작동하는 이유입니다. 실행 시간에.
그러나 이것은 여전히 Windows 환경에서 작동하는 이유를 설명하지 않습니다. Windows 환경 어딘가에 환경 변수가 설정되어 있어 효과가 있었지만 생각하는 이유는 아닙니다.