Windows11 に Swift をインストールする“やさしい”手順（Docker編）

https://qiita.com/nak435/items/478ef704c04520ad7960

↑先日、こちらの記事で、Windows11にWindows向けのSwiftをインストールする手順をまとめましたが、数日調べても`swift hello.swift`がエラーになる原因が分からず、断念した。


```terminal:原因不明のエラー
> swift hello.swift
<unknown>:0: error: could not load the swift standard library
```


その代わりに、今回は、Swift公式Docker Imageを使った手順をまとめます。
こちらは完璧に動作し、Windowsネイティブよりビルドも早い気がします。


# 1. WSL（Ubuntu 22.04.3）インストール

https://learn.microsoft.com/ja-jp/windows/wsl/install

↑公式サイトに書いてある通り、管理者モードのターミナルから、次のコマンドを実行する。

```terminal
> wsl --install
```

この1コマンドで、仮想マシン機能の有効化も含めて、Ubuntu がインストールされます。

# 2. Docker Desktop for Windows インストール

https://docs.docker.jp/desktop/install/windows-install.html

↑こちらの案内に従い、Docker Hub から Docker Desktop Installer.exe をダウンロード＆インストールしてください。

インストール後、Docker Desktop を起動し、画面左下の`Engine running`を確認する。

![engine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/9c4db833-b8a1-2d7c-c9bf-ec3997fc9fba.png)


# 3. Swift Docker 環境構築

↓公式サイトに書いてある手順そのものです。

https://hub.docker.com/_/swift

以降のDockerのコマンドは、すべて Ubuntuのターミナルから実行します。
（Windowsターミナルを起動し、Ubuntu を選択）

## 3-1 Swift Docker Image取得

`docker pull swift`コマンドでイメージを取得
（自分のPCで20分ほどかかった）

```terminal
$ docker pull swift

Using default tag: latest
latest: Pulling from library/swift
2ec76a50fe7c: Pull complete
031194576cad: Pull complete
7f110500e829: Pull complete
7ddf3aa876b7: Pull complete
Digest: sha256:ded3bdf39b1eb72198a9e0fb6102e98b9c30467fa9e70d5f7d17b4e1d324d29d
Status: Downloaded newer image for swift:latest
docker.io/library/swift:latest

$ docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED       SIZE
swift            latest    dea8a12cbbc1   2 weeks ago   2.63GB
```

## 3-2 コンテナの作成と起動

次の`docker run`コマンドでコンテナを作成し起動する

```terminal
$ docker run -it --name swiftfun swift /bin/bash

root@1d4ed170e8f5:/# swift --version
Swift version 5.10.1 (swift-5.10.1-RELEASE)
Target: x86_64-unknown-linux-gnu

root@1d4ed170e8f5:/# cat >hello.swift
print("Hello Swift!")
^D

root@1d4ed170e8f5:/# cat hello.swift
print("Hello Swift!")

root@1d4ed170e8f5:/# swift hello.swift
Hello Swift!
```

↑ちゃんと動きました。

↓もちろん、Replも動きます。

```terminal
root@1d4ed170e8f5:/# swift repl
Welcome to Swift version 5.10.1 (swift-5.10.1-RELEASE).
Type :help for assistance.
  1> let a = 10 + 5
a: Int = 15
  2> print(a)
15
  3> print("Hello!")
Hello!
  4> :quit
```

## 3-3 コンテナ停止

exit か Ctrl＋D でシェルから抜ける

```terminal
root@1d4ed170e8f5:/# exit

$ docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS                       PORTS     NAMES
abeb104c0a6d   swift     "/bin/bash"   About an hour ago   Exited (137) 2 minutes ago             swiftfun
```

## 3-3 コンテナ（シェル）を再び起動

```terminal
$ docker start -i swiftfun

root@ad90c6dae1f4:/# mkdir tmp/pj1
root@ad90c6dae1f4:/# cd tmp/pj1
root@ad90c6dae1f4:/tmp/pj1# swift package init --type executable
Creating executable package: pj1
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
root@ad90c6dae1f4:/tmp/pj1# swift run
Building for debugging...
[8/8] Linking pj1
Build complete! (1.93s) ⭐️早い
Hello, world!
root@ad90c6dae1f4:/tmp/pj1#
```

---

VSCodeからSwift Dockerを使う方法は、別の記事でまとめます。

2024.6.25追記

https://qiita.com/nak435/items/0e1f2ffed085335b09b9