#想定している読者
・Windows 10 pro (version 1809)
・WSL(Ubuntu18.04)
これらを使ってDockerを使用したい方。しかし何故か、
docker run hello-world
を実行すると次のようなエラーが出る方。
docker: Error response from daemon: failed to start shim: exec: "docker-containerd-shim": executable file not found in $PATH: unknown.
ERRO[0005] error waiting for container: context canceled
#解決策・結論
上記のエラーは、WSLでdocker version 18.09.7
を使用しているからです。
恐らく、WSLでdocker version 18.09.7
はまだサポートされていないと考えられます。
現時点(2019/08/12)で、WSL上にインストールすべきdockerのバージョンは17.12.1です。※CE(コミュニティエディション)において。
ここからは、
-
version 17.12.1
のインストールの仕方 -
sudo apt -y upgrade
してもdockerのversionを変更させない方法
の二点を説明していきます。
#1.version17.12.1のインストール&起動
$ sudo apt install docker.io=17.12.1-0ubuntu1
$ sudo cgroupfs-mount
$ sudo usermod -aG docker $USER
$ sudo service docker start
毎回、sudo cgroupfs-mount && sudo service docker start
するのは面倒なので、Docker.shファイルを作成します。(ファイル名はなんでも良い)
#!/bin/sh
pass='' #Ubuntuのパスワード
echo "$pass" | sudo -S cgroupfs-mount && sudo service docker start
sleep 15
docker version
ファイルに権限を与えます。
$ chmod 700 Docker.sh
このファイルのあるディレクトリで、./Docker.sh
とコマンドを入力します。
※sudoの**-Sオプションは「パスワードを端末ではなく標準入力から読み込む」という意味です。sudo service docker start
の後に、標準入力でパスワードを求められます。
※#!/bin/sh**に関しては、こちらの記事が詳しいです。
#2.特定のパッケージをupgradeさせない方法
apt-markを使い、パッケージのversionを固定する。
$ sudo apt-mark hold docker.io
docker.io set on hold.
holdしたパッケージの一覧表示
$ apt-mark showhold
docker.io
以上のように設定することで、sudo apt -y upgrade
してもversionが勝手に変更されないです。
#3.docker run hello-world
WSL(Ubuntu18.04)を一度閉じて、管理者権限で開いてください。
先ほど、作成したDocker.sh
でdockerを起動します。
$ ./Docker.sh
* Starting Docker: docker [ ok ]
Client:
Version: 17.12.1-ce
API version: 1.35
Go version: go1.10.1
Git commit: 7390fc6
Built: Wed Apr 18 01:23:11 2018
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.1-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.10.1
Git commit: 7390fc6
Built: Wed Feb 28 17:46:05 2018
OS/Arch: linux/amd64
Experimental: false
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
これで完了です