奇妙なケースですが、 secret.env ファイルがあり、そこですべての環境変数を次のように設定しています。
秘密.env
export TWITTER_CONSUMER_KEY="something"
export TWITTER_CONSUMER_SECRET="something"
次に、すべての変数をエクスポートし、次のようにアプリを実行するための Docker ファイルを作成しました。
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'
これを Windows で実行すると、正常に動作します。
誰かこの件について助けてくれませんか?
答え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 は、実行可能ファイルとして実行されるコンテナを構成します。
私は Docker の専門家ではありませんが、仕事で数回使用したことがあり、基本的な知識はあります。これが機能する理由は、レイヤー化のためであり、さらに重要なのは、環境変数をソース化するアクションがディスク上のストレージではなく、純粋にメモリ領域のみで行われるためだと思います。したがって、RUN でソース化しても実際には何も達成されません。実際のアプリケーションの実行時点でソース化する必要があります。これが、上記の ENTRYPOINT 修正が機能する理由です。実行時に、BASH を呼び出して変数を環境にソース化し、Python アプリケーションをフォークする、すべて同じシェルで実行時に実行されるためです。
ただし、これはまだ Windows 環境で動作する理由を説明していません。Windows 環境のどこかに環境変数が設定されているため、それが動作しているが、それが動作している理由はあなたが考えているものではないのではないかと思います。