web-dev-qa-db-ja.com

エントリーポイント変数の展開とCMDパラメーターを備えたDockerコンテナー

ユーザーが環境変数としてトークンを渡す実行可能ファイルとして機能するDockerイメージを作成したいと思います。実行可能ファイルには、ユーザーがdocker CMDを介して渡す必要のあるサブコマンドがあります(Envによる認証付きのgitを考えてください)。ただし、DockerはCMDをエントリポイントに追加しません。私のDockerfileの関連部分は次のようになります。

ENTRYPOINT ["/bin/sh", "-c", "/usr/bin/mycmd --token=$MY_TOKEN"]
CMD ["pull", "stuff"]

したがって、このコンテナがCMDオーバーライドなしで実行され、MY_TOKEN変数としてsecretが使用された場合、

mycmd --token=secret pull stuff

実行されます。ユーザーがオーバーライドを使用してコンテナを開始した場合。

docker run -it -e MY_TOKEN=secret myimage Push junk

私は期待します

mycmd --token=secret Push junk

実行されます。ただし、前述のように、mycmd --token=secretが実行されると、CMDは無視されます。起動時にオーバーライドしたり、Dockerfileで設定したりしても関係ありません。

19
feob

/bin/sh -c "script"構文を使用すると、-c引数の後はスクリプトの引数になります。/bin/shスクリプトの一部として$0および$@を使用してそれらに到達できます。

ENTRYPOINT ["/bin/sh", "-c", "exec /usr/bin/mycmd --token=$MY_TOKEN $0 $@"]
CMD ["pull", "stuff"]

エントリポイントを、exec /usr/bin/mycmd --token=$MY_TOKEN "$@"を実行するイメージに追加されたシェルスクリプトに変更し、そのシェルスクリプトをdockerのexec構文で実行することもできます。

ENTRYPOINT ["/entrypoint.sh"]
12
BMitch

指定された dockerのドキュメント のように、シェルを呼び出すエントリポイントを指定しています(したがって、シェルフォームではなく、execフォームで)。パラメータはシェルに渡されます(したがって無視されます)。シェルのコマンドだけが重要です。エントリポイントの呼び出しを次のように切り替えると、問題が解決したことがわかります。

ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]

エントリポイントでシェルを呼び出すことはあまりお勧めできませんが、イメージのユーザーがカスタムパラメータをエントリポイントに追加するのを避けたい場合にのみ役立ちます。

インターウェブでお会いしましょう! :)