.NET Coreアプリをさくっと作ってコンテナにする

## 概要

Ubuntu に .NET Core SDK をさくっとインストールし
簡単な.NET Coreアプリを作り、
ついでにコンテナイメージにしたよ

環境

```bash
$ uname -a
Linux hoge 4.13.0-46-generic #51-Ubuntu SMP Tue Jun 12 12:36:29 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=17.10
DISTRIB_CODENAME=artful
DISTRIB_DESCRIPTION="Ubuntu 17.10"
```

## インストール

基本的には本家ドキュメントを見てね
各ディストリビューション毎にあるよ

- [Install .NET Core SDK on Linux Ubuntu 16.04 - x64](https://dotnet.microsoft.com/download/linux-package-manager/ubuntu16-04/sdk-current)
  - aptで入れるよ
- [Install .NET Core SDK on Linux CentOS / Oracle - x64
](https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current)
  - yumで入れるよ

以下のようにsnapコマンドでもインストールできたよ

``` sh
$ sudo snap install dotnet-sdk --classic
2019-04-07T17:24:48+09:00 INFO Waiting for restart...
dotnet-sdk 2.2.202 from 'dotnetcore' installed
$
```

バージョン確認。コマンド名が長いのでaliasを設定したよ。

``` sh
$ dotnet-sdk.dotnet --version
2.2.203
$ sudo snap alias dotnet-sdk.dotnet dotnet
$ dotnet --version
2.2.203
$
```

## 新規プロジェクト作成

[dotnet new {TEMPLATE}](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new?tabs=netcore21)コマンドを使うよ

今回はコンソールアプリケーションを作るので、`TEMPLATE`には`console`を指定しているよ。
その他のテンプレートは[ここ](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new?tabs=netcore21#arguments)にあるよ

`-n`でプロジェクトの名前を指定するよ

``` sh
$ dotnet new console -n my-app
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on my-app/my-app.csproj...
  Restore completed in 101.17 ms for /home/loft/dev/dotnet-apt-test/my-app/my-app.csproj.

Restore succeeded.

$ ls -Fla my-app
total 20
drwxrwxr-x 3 loft loft 4096  ./
drwxrwxr-x 3 loft loft 4096  ../
-rw-rw-r-- 1 loft loft  221  my-app.csproj
drwxrwxrwx 2 loft loft 4096  bj/
-rw-rw-r-- 1 loft loft  188  Program.cs
$
```

## ビルド＆起動

`dotnet build`でビルド、`dotnet run`でビルド＆起動するよ

``` sh
$ cd my-app/
$ dotnet run
Hello World!
$
# ちなみにDebugビルドで、成果物はここにある
$ dotnet bin/Debug/netcoreapp2.2/my-app.dll
Hello World!
$
```

新規プロジェクト作成時点でHello World!が実装されているよ。

あとは必要な機能を実装するだけだね！


## NuGetパッケージを追加する

[dotnet add package](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-add-package)コマンドで追加できるよ


``` sh
# やべえ！ jsonの処理を実装したんだけど、Newtonsoftパッケージがねえ！
$ dotnet run
error CS0246: The type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?) [/home/loft/hoge/my-app/hoge.csproj]

The build failed. Please fix the build errors and run again.

# 追加しよう 
$ dotnet add package Newtonsoft.Json

# 無問題！
$ dotnet run
Hello World!
$
```

## リリース構成で出力する

[dotnet publish](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish?tabs=netcore21) コマンドで出力できるよ

`-c`にビルド構成(`Debug`や`Release`) を指定できるよ

`bin/Release/netcoreappx.x/publish/`配下が配布用の成果物一式だよ

``` sh
$ dotnet publish -c Release
$ dotnet bin/Release/netcoreapp2.2/publish/my-app.dll
Hello World!
$
```

## コンテナイメージにする

ベースイメージは[.NET Core Runtime
](https://hub.docker.com/_/microsoft-dotnet-core-runtime/)
Dockerfile

``` Dockerfile
FROM mcr.microsoft.com/dotnet/core/runtime:2.2
LABEL  maintainer "your-name <your@email.hoge>"

# dotnet publishした一式を配置
ENV APP=my-app
WORKDIR /root/${APP}
COPY ./bin/Release/netcoreapp2.2/publish/* ./

# 起動コマンド
CMD dotnet ${APP}.dll
```

コンテナイメージビルド、コンテナ起動

``` sh
$ sudo docker build -t my-app .
$ sudo docker run -d --name my-app -h my-app my-app
$ sudo docker ps -a | grep my-app
38a2e6a3704e   my-app   "/bin/sh -c 'dotne..."   9 seconds ago  Exited (0) 7 seconds ago                                                                                        my-app
$ sudo docker logs my-app
Hello World!
$
```