ユーザーが環境変数としてトークンを渡す実行可能ファイルとして機能する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で設定したりしても関係ありません。
/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"]
指定された dockerのドキュメント のように、シェルを呼び出すエントリポイントを指定しています(したがって、シェルフォームではなく、execフォームで)。パラメータはシェルに渡されます(したがって無視されます)。シェルのコマンドだけが重要です。エントリポイントの呼び出しを次のように切り替えると、問題が解決したことがわかります。
ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]
エントリポイントでシェルを呼び出すことはあまりお勧めできませんが、イメージのユーザーがカスタムパラメータをエントリポイントに追加するのを避けたい場合にのみ役立ちます。
インターウェブでお会いしましょう! :)