由 Dockerfile 安裝 .NET Core SDK

雖然 Microsoft 官方提供 .NET Core 的 Docker image,但實務上建置環境時,可能先使用其他 server 的 image,然後再加裝 .NET Core SDK 環境,如此就需要自行建立 Dockerfile,並建立自己的 image。

Version


macOS High Sierra 10.13.3
Docker for Mac 17.12.0-ce-mac55 (23011)
Ubuntu 16.04.3 LTS
.NET Core SDK 2.1.4

Dockerfile


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FROM ubuntu

# Switch to root to install .NET Core SDK
USER root

# Show distro information!
RUN uname -a && cat /etc/*release

# Based on instructiions at https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x
# Install dependency for .NET Core 2
RUN apt-get update
RUN apt-get install -y libunwind8 liblttng-ust0 libcurl3 libssl1.0.0 libuuid1 libkrb5-3 zlib1g libicu55 curl

# Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/rhel/sdk-current
# Install microsoft.qpg
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
RUN mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'

# Install the .Net Core framework
RUN apt-get install apt-transport-https
RUN apt-get update
RUN apt-get install -y dotnet-sdk-2.1.4

第 1 行

1
FROM ubuntu

ubuntu 這個 image 為基底建立 image。

Q : 為什麼不用 ubuntu:lts 呢 ?

預設 ubuntuubuntu:latest,而 ubuntu:latest 指的就是 latest lts,所以已經是 LTS 版本

第 3 行

1
2
# Switch to root to install .NET Core SDK
USER root

因為即將使用 apt-get 安裝 package,所以直接切換到 root 帳號執行以下動作。

第 6 行

1
2
# Show distro information!
RUN uname -a && cat /etc/*release

顯示目前 image 的版本資訊。

此段並非安裝 .NET Core SDK 所必須,但因為 Linux 的 ditribution 眾多,每個 Dockerfile 的寫法也會有所差異,因此這行可以幫助 Dockerfile 撰寫

第 9 行

1
2
3
4
# Based on instructiions at https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x
# Install depency for .NET Core 2
RUN apt-get update
RUN apt-get install -y libunwind8 liblttng-ust0 libcurl3 libssl1.0.0 libuuid1 libkrb5-3 zlib1g libicu55 curl

根據官網的 Prerequisites for .NET Core on Linux,若要在 Linux 安裝 .NET Core,在 Ubuntu 還必須安裝以下額外 package :

  • libunwind8
  • liblttng-ust0
  • libcurl3
  • libssl1.0.0
  • libuuid1
  • libkrb5-3
  • zlib1g
  • libicu52 (for 14.X)
  • libicu55 (for 16.X)
  • libicu57 (for 17.X)

其中 curl 在並不算 .NET Core SDK 所需要的 package,但接下來要用 curl 安裝 microsoft.qpg,所以也需要特別安裝。

14 行

1
2
3
4
5
# Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/rhel/sdk-current
# Install microsoft.qpg
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
RUN mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'

根據官網的 Install .NET Core SDK on Linux Ubuntu 16.04 所描述,要安裝 .NET Core SDK 前,必須先將 microsoft.gpg 裝好。

20 行

1
2
3
4
# Install the .Net Core framework
RUN apt-get install apt-transport-https
RUN apt-get update
RUN apt-get install -y dotnet-sdk-2.1.4

所有的 dependency 與 microsoft.gpg 都裝好後,就可以正式安裝 .NET Core SDK 了。

建立 Image


1
~/UbuntuCore $ docker build -t oomusou/ubuntu-core .

進入 Dockerfile 所在的目錄,使用 docker build 建立自己的 image。

  • -t : Docker image 的名稱
  • . : 將目前目錄的 Dockerfile 建立成 image

ubuntu002

  1. 輸入 docker build -t oomusou/ubuntu-core .Dockerfile 建立成 oomusou/ubuntu-core
  2. uname -a && cat /etc/*release 顯示出 Linux 資訊

建立並執行 Container


1
$ docker run --name MyUbuntuCore -dt oomusou/ubuntu-core

使用 docker run 由 image 建立 container 並執行之。

  • --name : 替 container 取一個人能夠識別的名字 ( 若省略,Docker 將隨機命名 )
  • -d : detach,建立 container 後,就脫離目前 process
  • -t : terminal,預設執行 /bin/bash process,為了讓 container 啟動後不會立即停止
  • oomusou/ubuntu-core : 剛剛自己建立的 image

ubuntu000

測試 .NET Core SDK


1
2
$ docker exec -it MyUbuntuCore bash
root@xxx:/# dotnet --version

使用 docker exec 對已經執行中的 container 下指令。

  • -i : interactive,可對 terminal 輸入資料
  • -t : terminal,可對 terminal 顯示資料
  • MyUbuntuCore : Container 名稱
  • bash : 對 container 下的指令

ubuntu001

  1. 輸入 docker exec -it 進入 container 的 terminal
  2. 輸入 dotnet —version 確認 .NET Core SDK 已經安裝成功

Conclusion


  • 如使用 Jenkins 對 .NET Core 進行持續整合,實務上會把專案 git clone 到 Jenkins 端執行單元測試,此時執行 dotnet test 就必須有 .NET Core SDK 環境,但我們不會使用 .NET Core 的 Docker image,而會使用 Jenkins 所提供的 image,此時就必須自己寫 Dockerfile,並將 .NET Core SDK 環境安裝在 Jenkins 上。

Reference


.NET Core, Prerequisites for .NET Core on Linux
.NET Core, Install .NET Core SDK on Linux Ubuntu 16.04