。NETコアプロジェクトがあります(Visual Studioを使用し、 Visual Studio Tools for Docker を介してDockerファイルを追加します)。
私のDockerFile
は次のようになります:
FROM Microsoft/dotnet:1.0.1-core
ARG source=.
WORKDIR /app
COPY $source .
ENTRYPOINT ["dotnet", "MyApp.dll"]
CMD ["arg1", "arg2"]
私の質問は、どのようにパラメータをプロジェクトに渡すのですか?
public static void Main(string[] args)
{
// how does `args` get populated?
}
docker-compose.ymlでも設定できる環境変数を使用しました
public static class EnvironmentHelper
{
public const string EnvironmentArguments = "DOTNETCORE_ARGUMENTS";
private static string[] _arguments;
public static string[] Arguments
{
get
{
bool argumentsExist = _arguments != null && _arguments.Any();
if (!argumentsExist)
{
IDictionary environmentVariables = Environment.GetEnvironmentVariables();
if (!environmentVariables.Contains(EnvironmentArguments))
{
throw new Exception("Environment Arguments do not exist");
}
var argumentsHolder = environmentVariables[EnvironmentArguments] as string;
const char argumentSeparator = ' ';
_arguments = argumentsHolder?.Split(argumentSeparator);
}
return _arguments;
}
}
}
これは、ENTRYPOINT
を組み合わせてコマンドを設定し、CMD
を組み合わせてデフォルトオプションを設定することで実行できます。
例、ASP.NETCoreアプリの場合:
ENTRYPOINT ["dotnet", "app.dll"]
CMD ["argument"]
コマンドなしでコンテナを実行すると、コンテナの起動時に次のコマンドが実行されます。
dotnet app.dll argument
そして、args
配列には「argument」という1つのエントリがあります。ただし、コマンドを渡すことはできますo docker run
CMD
定義をオーバーライドするには:
docker run app arg1 arg2
Docker用のVSツールは、CMD引数とENTRYPOINT引数をサイレントにオーバーライドしているように見えます。 Visual Studioでdocker-composeプロジェクトをデバッグするときにコマンドラインを渡す方法 および https://github.com/Microsoft/DockerTools/issues/75 を参照してください。
1つのアプローチは、環境変数を読み込むことです。これを行うためにDockerfileを変更することはありません。むしろ、次のようにコンテナを実行するとします。
$ FOO="bar"
$ docker run -e FOO=$FOO devlife/myapp
ここで理解する必要があるのは、dotnetcoreアプリケーションでFOO環境変数を読み取る方法だけです。ここに記載されているアプローチを試してみます: ASP .NET Core読み取り環境変数