docker の windowsfilter をクリーンアップする

Docker CLI 使って Windows コンテナ生活を送っていたら、突如、ストレージに空きがないメッセージが。

tnakamura.hatenablog.com

C ドライブがほぼ満杯。C:\ProgramData\docker\windowsfilter にファイルが大量に残っている。それも、何十GBも。docker の各種 prune コマンドを実行してみたけど消せない。もはやバグだろうこれ?

次のイシューコメントによると、リネームして -removing 接尾句を足してやれば、docker の Windows サービスを終了するときに消してくれるようだ。

github.com

リネーム用のスクリプトも公開してくれていた。

このスクリプトを実行してリネームした後、docker の Windows サービスを再起動したら、windowsfilter下のファイルが削除された。

C ドライブの空きが少なくなったら、その都度消すしかないのか。せめて prune で消せるようになってほしい。

Docker CLI で Windows コンテナを試す

久しぶりに Windows コンテナを試したいが、Docker Desktop は有料化していた。まだ調査段階なので、会社にライセンスを買ってもらうには早い。Docker CLI で頑張ってみることに。

Windows の機能の有効化または無効化」を見てみると、下記の機能が既に有効になっていた。

Docker をダウンロードし、任意の場所に展開。

https://download.docker.com/win/static/stable/x86_64/

PATH を通して docker と dockerd コマンドが使えるようにする。

Windows Terminal を管理者として実行し、下記のコマンドを実行。

dockerd --register-service
Start-Service docker
docker run -it -p 8080:80 mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019

ブラウザで localhost:8080 にアクセスすると、ちゃんと IIS のページが表示された。

Windows サービスを Network Service アカウントで動かす PowerShell スクリプト

Windows サービスとして動くようにした ASP.NET Core アプリを、Network Service アカウントで動かすための PowerShell スクリプトを書いた。

$serviceName = "Windows サービス名"
$exePath = "Windows サービスとして動かす exeのパス"
$displayName = "表示名"
$description = "説明"

$password = ConvertTo-SecureString "dummy" -AsPlainText -Force 
$credential = New-Object System.Management.Automation.PSCredential ("NT AUTHORITY\NETWORK SERVICE", $password)

New-Service -Name $serviceName -BinaryPathName $exePath -DisplayName $displayName -Description $description -StartupType Automatic -Credential $credential

& sc.exe failure $serviceName reset= 86400 actions= restart/60000/restart/60000/restart/60000

Start-Service -Name $serviceName

おまけで、アンインストールも。

$serviceName = "Windows サービス名"

Stop-Service -Name $serviceName

& sc.exe delete $serviceName

OpenAPI Specification の JSON から PDF を生成する

はじめに

OpenAPI Specification の JSON から、API の PDF ドキュメントを生成したい。

openapi-generator で直接 PDF を出力することはできないけど、AsciiDoc を挟むことで、最終的に PDF ドキュメントを生成できそうだったので試してみた。

OpenAPI Generator をインストール

Invoke-WebRequest -OutFile openapi-generator-cli.jar https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/5.1.0/openapi-generator-cli-5.1.0.jar

OpenAPI Specification の JSON から AsciiDoc ファイルを生成

openapi-generator から直で AsciiDoc を出力できるようになっていた。

java -jar openapi-generator-cli.jar generate -i openapi.json -g asciidoc -o .\asciidoc

Ruby Installer で Ruby をインストール

AsciiDoc を PDF に変換するツール asciidoctor-pdf は Ruby 製なので、まずは Ruby をインストール必要がある。

rubyinstaller.org

asciidoctor-pdf をインストール

gem install asciidoctor-pdf

TTF ファイルを用意

デフォルトだと PDF の日本語が文字化けしたので、お好みの日本語フォントをダウンロードして使う。

jikasei.me

スタイルファイルを作成

asciidoctor-pdf が用意した日本語フォントを使えるようにするために、デフォルトのスタイルファイルを修正する。

github.com

font:
  catalog:
    GenShinGothic:
      normal: GenShinGothic-Light.ttf
      italic: GenShinGothic-Light.ttf
      bold: GenShinGothic-Medium.ttf
      bold_italic: GenShinGothic-Medium.ttf
base:
  font_family: GenShinGothic
literal:
  font_family: GenShinGothic

PDF 作成

日本語フォントが置かれたフォルダと、修正したスタイルファイルを指定して、asciidoctor-pdf を実行。

asciidoctor-pdf index.adoc -a pdf-style=my-theme.yml -a pdf-fontsdir=fonts -o index.pdf

おわりに

openapi-generatorr から直で PDF まで出せたら最高だけど、さすがにそれは望み薄か。CLI のツールで欲しい。

PowerShell で Windows Firewall に規則を追加する

管理者権限で New-NetFirewallRule コマンドレットを実行。サンプルは次の通り。

New-NetFirewallRule -Name Example -DisplayName "Example TCP" -Description "Example Permit TCP/443" -Protocol TCP -LocalPort 443 -Enabled True -Profile Any -Action Allow

Docker や Packer で結構使うのでメモ。

Packer で Azure VM のイメージを作成しようとしたら WinRM の有効化でタイムアウトした

Microsoft Docs の資料を参考に、Packer を使って Azure VM のイメージを作成しようと試みた。

docs.microsoft.com

ところが、WinRM の有効化を待機しているところでタイムアウトwinrm_timeout を延ばしてもダメ、vm_size を上げてもダメ、image_sku を変えてもダメときた。

原因はしょーもなくて、WinRM が使う 5896 番ポートが社内のゲートウェイでブロックされていたから。Packer のテンプレートや Azure 側には何の問題も無かった。こんなことで 1日潰れて萎える。自由なインターネット環境が欲しい。今後は真っ先に社内のネットワークを疑うようにしよう。

PowerShell Core で ghq と peco を組み合わせるメモ

  1. PATH が通っている場所に ghq.exe と peco.exe を配置。
  2. %UserProfile%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 に次のような関数を定義する。
function g {
    cd $(ghq list | peco)
}