.NET Core 3.0 SDK Docker ImageにPowerShell Coreが含まれました

2019.04.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

つい先日.NET Core 3.0 Preview 4がリリースされましたが、このSDKを含むDockerコンテナイメージ(mcr.microsoft.com/dotnet/core/sdk:3.0)にPowerShell Coreが含まれることになりました。

こちら中の人のツイート。

そして該当のGitHub Issueです。

含まれるPowerShellのバージョンについて

現在のところコンテナにはPowerShell Core 6.2(.NET Core 2.1製)が含まれています。
PowerShellのバージョンは随時更新されていくものと思われます。

また、SDKを含まない.NET Core/.NET Core RuntimeのDockerイメージにはPowerShell Coreは含まれません。
開発ツールとしてSDKにPowerShell Coreを付帯させる形となっており、イメージサイズを気にする人にとっても安心の内容となっています。

何が嬉しいのか?

これによりdocker runなどのコマンドでPowerShell Coreが容易に使える様になるのと、.NET Coreアプリケーション開発においてPowerShellでビルドタスクなどを書いていた場合は既存のスクリプトを割と容易にコンテナ化、クロスプラットフォーム化できるのではないかと思います。

以下にGitHubのIssueにあった簡単なPowerShell実行例を記載しておきます。

# GitHubのIssueにあった簡単なPowerShell実行例
docker run --rm mcr.microsoft.com/dotnet/core/sdk:3.0 pwsh -c Write-Host "Hello Powershell"

.NET Core Global Toolsを使ったPowerShell Coreのインストール

ここで、このイメージのDockerfileを見てみるとPowerShell Coreのインストール方法がちょっと変わていることに気が付きます。

# 上記Dockerfileより一部引用

# Install PowerShell global tool
ENV POWERSHELL_VERSION 6.2.0

RUN wget -O PowerShell.Linux.Alpine.$POWERSHELL_VERSION.nupkg https://pwshtool.blob.core.windows.net/tool/$POWERSHELL_VERSION/PowerShell.Linux.Alpine.$POWERSHELL_VERSION.nupkg \
    && powershell_sha512='56c823a266c81d71d10dad4dc3a6967486ba54ad3165205bdf573da7d036b0f8205a2573917599e4593ca2a3309a1298ecd6f45cefd6aa678f00405c55c9c6bc' \
    && echo "$powershell_sha512  PowerShell.Linux.Alpine.$POWERSHELL_VERSION.nupkg" | sha512sum -c - \
    && mkdir -p /usr/share/powershell \
    && dotnet tool install --add-source / --tool-path /usr/share/powershell --version $POWERSHELL_VERSION PowerShell.Linux.Alpine \
    && rm PowerShell.Linux.Alpine.$POWERSHELL_VERSION.nupkg \
    && ln -s /usr/share/powershell/pwsh /usr/bin/pwsh \
    # To reduce image size, remove the copy nupkg that nuget keeps.
    && find /usr/share/powershell -print | grep -i '.*[.]nupkg$' | xargs rm \
    # Add ncurses-terminfo-base to resolve psreadline dependency
    && apk add --no-cache ncurses-terminfo-base

一連のコマンドの途中で、

dotnet tool install --add-source / --tool-path /usr/share/powershell --version $POWERSHELL_VERSION PowerShell.Linux.Alpine

とある様にここではPowerShell CoreをNugetパッケージ(.nupkg)からdotnetコマンドを使いインストールしています。

これは、PowerShell Core 6.1のリリース時にアナウンスされていた.NET Core Global Toolsサポート実装の様です。
詳細は私の個人ブログをご覧ください。

また、PowerShellのこちらのIssueによると

@AceHack Nice observation, but not 100% correct. It is installing that nupkg as a dotnet tool, but "soon", you should just be able to do: dotnet tool install powershell without pre-downloading the nupkg.

とあり、将来的にはNugetパッケージの事前ダウンロードは不要となり、単純にdotnetコマンド一発でPowerShellのインストールが可能になる見込みだそうです。

最後に

ざっとこんな感じです。
単純なアナウンスの中に.NET Core Global Toolsサポートがこっそり紛れ込んでいておりPowerShellおじさんとしては油断ならない内容でした。

PowerShellはもともとシステム管理者向けに生まれたツールですが、これをきっかけとして.NETな開発者のみなさんにも広く使ってもらえる様になると嬉しいですね。