はじめに
.Net coreのコンソールアプリをコンテナ化しようといろいろ調べたんですが
自分的にイメージしにくかったので図示してみます。
図
①ベースイメージ取得
Docker Hubからベースとなるイメージを取得してくる。
SDKやらRuntimeやらいろいろある。
例えばsdk2.1
docker pull mcr.microsoft.com/dotnet/core/sdk:2.1
②コンテナを起動して中に入る
GitHubからソースコードを取得する想定
docker run -itd --name tmp mcr.microsoft.com/dotnet/core/sdk:2.1 /bin/bash
docker exec -it tmp /bin/bash
共有フォルダからソースコードを取得しようと思ったら--mountで設定必要
③.net coreソースコード取得
例えば.NetCoreのサンプルアプリのソースコードを取得
mkdir -p /src; cd $_
git clone https://github.com/dotnet/core.git
cd core/samples/helloworld
④dotnet publishでdll作成
mkdir /helloworld
dotnet publish -c Release -o /helloworld
dotnet /helloworld/helloworld.dll
で実行可能な状況になる。
配置には
- フレームワークに依存する展開(Framework-dependent deployment、FDD)
- 自己完結型の展開(Self-contained deployment、SFD)
があるらしい。
コンソールアプリを外部から呼びやすくする方法として.NET Core CLI を使用して .NET Core グローバル ツールを作成するとかも。
⑤ docker commitでimage化
コンテナから抜け出てから
docker commit tmp helloworld
とするとmcr.microsoft.com/dotnet/core/sdk:2.1をベースとしたhelloworld.dllが実行可能なhelloworldというイメージが新たに出来上がる。
tmpは②で指定したコンテナ名。helloworldはイメージ名。
DockerFile
こんなことを毎回手動ではやってられないのでDockerFileで自動化する。
解説はいきなりDockerFileの記述から始まるので根本的なところがわからなかった。
dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:2.1
WORKDIR /src
RUN git clone https://github.com/dotnet/core.git
WORKDIR core/samples/helloworld
RUN mkdir /helloworld
RUN dotnet publish -c Release -o /helloworld
ENTRYPOINT ["dotnet", "/helloworld/helloworld.dll"]
上記ファイルがある場所で
docker build -t helloworld .
を実行すればイメージが出来上がる。
docker run helloworld
で
Hello World!
が出力される。
イメージの配置
- 実行環境でdocker build
- 出来上がったイメージを実行環境にエクスポート
とかすれば使えるようになるはず。