ENV変数を使用するENTRYPOINTを持つDockerfileがあります。コンテナが追加のコマンドライン引数を受け入れることもできるように、ENTRYPOINTを構造化できません。 Dockerfileの関連部分は次のとおりです。
ARG MODULE_NAME
ENV MODULE_NAME=$MODULE_NAME
ENTRYPOINT /usr/bin/python3 -m ${MODULE_NAME}
追加の引数なしでコンテナを起動したいだけの場合、それはうまくいきます:
docker run my-image
ただし、追加のコマンドライン引数(たとえば、「-debug」フラグ)をpythonプロセスに渡すことができる必要があります。
docker run my-image --debug
上記のENTRYPOINTの形式では、「-debug」引数はpythonプロセスに渡されません。ENTRYPOINTのexec形式とShell形式の両方を試しましたが、取得できませんENV変数andコマンドライン引数の両方で動作するように。
これは実行されますが、追加の引数は受け入れません。
ENTRYPOINT ["/bin/bash", "-c", "/usr/bin/python3 -m ${MODULE_NAME}"]
これにより、「/ usr/bin/python3:$ {MODULE_NAME}という名前のモジュールはありません」が得られます。
ENTRYPOINT ["/usr/bin/python3", "-m ${MODULE_NAME}"]
これにより、「/ usr/bin/python3:$ {MODULE_NAME}という名前のモジュールはありません」が得られます。
ENTRYPOINT ["/usr/bin/python3", "-m", "${MODULE_NAME}"]
両方の変数展開を直接サポートするENTRYPOINTを作成することはできないようですおよび追加のコマンドライン引数。 ENTRYPOINTのシェル形式は、実行時にENV変数を展開しますが、docker run
コマンドからの追加(追加)引数を受け入れません。 ENTRYPOINTのexec形式は追加のコマンドライン引数をサポートしますが、デフォルトではシェル環境を作成しないため、ENV変数は展開されません。
これを回避するには、execフォームでbash
を明示的に呼び出してスクリプトを実行し、ENV変数を展開してコマンドライン引数をpythonプロセスに渡します。これを行うDockerfileの例:
FROM ubuntu:16.04
ARG MODULE_NAME=foo
ENV MODULE_NAME=${MODULE_NAME}
RUN apt-get update -y && apt-get install -y python3.5
# Create the module to be run
RUN echo "import sys; print('Args are', sys.argv)" > /foo.py
# Create a script to pass command line args to python
RUN echo "/usr/bin/python3.5 -m $MODULE_NAME \$@" > /run_module.sh
ENTRYPOINT ["/bin/bash", "/run_module.sh"]
Dockerイメージからの出力:
$ docker run my-image
Args are ['/foo.py']
$ docker run my-image a b c
Args are ['/foo.py', 'a', 'b', 'c']
(シェル形式を使用しているため)RUNコマンドの実行中に変数が展開されることに注意してください。したがって、イメージ内のrun_script.pyの内容は次のとおりです。
/usr/bin/python3.5 -m foo $@
最後のRUNコマンドがこれに置き換えられた場合:
RUN echo "/usr/bin/python3.5 -m \$MODULE_NAME \$@" > /run_module.sh
その後、run_script.shには以下が含まれます。
/usr/bin/python3.5 -m $MODULE_NAME $@
ただし、実行時に変数が展開されるため、実行中のコンテナからの出力は同じになります。 2番目のバージョンの潜在的な利点は、ENTRYPOINTを置き換えることなく、実行時に実行されるモジュールをオーバーライドできることです。