WSL1&Docker Desktop環境でファイルのマウント

Dockerコンテナを起動時にローカルのデータディレクトリや設定ファイルをコンテナ内にマウントしたい場合があると思います。しかし、CドライブをDocker DesktopのVMはを/cにマウントし、WSLは/mnt/cにマウントするため、

$ docker run -v ./conf/nginx.conf:/etc/nginx/nginx.conf

ような形で、ローカル側のファイルを指定すると、次のようなエラーが発生します。

Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/mnt/c/workspace/test-app/config/nginx.conf" to rootfs a
t "/etc/nginx/nginx.conf": mount /mnt/c/workspace/test-app/config/nginx.conf:/etc/nginx/nginx.conf (via /proc/self/fd/14), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

これを防ぐにはWSL上でも/cから始まるパスを利用するようにします。

まず/cディレクトリを作成します。

$ sudo mkdir /c

次に/cを/mnt/cにマウントします。

$ sudo mount --bind /mnt/c /c

/c配下のプロジェクトディレクトリに移動してDockerを起動します。

$ cd /c/workspace/test-app
$ docker run -v ./conf/nginx.conf:/etc/nginx/nginx.conf

※/cをマウントしても、/mnt/c配下のプロジェクトディレクトリではエラーのままになりますので、注意してください。

Dockerでイメージを最新に更新

Docker Hubから取得したイメージは自動的には更新されません。特定のイメージを利用してコンテナを作成した場合、初回は最新のイメージをDocker Hubから取得しますが、二回目以降はタグがlatestであってもローカルにあるイメージが利用されます。

ローカルのイメージを更新するには、pullコマンドを利用します。

$ docker pull <リポジトリ名>[:<タグ名>]

DockerでOCI runtime create failedエラー

CentOS環境において、誤ってDockerのコンテナを起動したまま、yumでdocker-ceパッケージをアップデートしてしまいました。

その後、再度コンテナを起動しようとしたのですが、次のエラーにより起動ができない状態になりました。

$ docker start postfix
Error response from daemon: OCI runtime create failed: container with id exists: d21dd44a4cd471de93a5869922288143d7a1e2395f90b9bee9dc4ca5476524cc: unknown
Error: failed to start containers: postfix

次のフォルダにある、コンテナ名を持つフォルダを削除することで、起動が可能になりました。

/run/docker/runtime-runc/moby

Dockerコマンドのまとめ

コンテナ内からホストへファイルをコピー

$ docker cp <ContainerId>:/path/to/file/in/container /target/path/in/host

起動中のコンテナにログイン

$ docker exec -it <ContainerId> bash

ログ(コンテナからの標準出力)の確認

$ docker logs <ContainerId>
Top