0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-in-dockerでボリュームがマウントされない (bindされない)

Posted at

はじめに

15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用までという本を勉強するために、docker-in-docker(dind)でLinux Alpineの上にUbuntuのコンテナを作成して、Kubernetesをインストールして使えるようにしました。

そのあと、AlpineコンテナにあるシェルスクリプトをUbuntuコンテナにbindしようとしました。
しかし、何故か共有できません。かなり調べたのですが解決方法が見当たらず。
また、Teratail質問したところ、詳しい方が同じ環境でちゃんとマウントできたよというコメントがきました。

しかし、会社の方や別のパソコンでも試しましたが、やはり共有できなかったのでまとめたいと思います。
根本的解決はできませんでしたが、共有できるように設定することは可能でした。

環境

  • Docker Desktop for Windows
  • Ubuntu 18.04

問題

ここでは、マウントができないことを再現するため以下のよう環境を用意しました。

ディレクトリ構成

root/
┣ Dockerfile (Ubuntu)
┣ docker-compose.yml (Ubuntu)
┣ vm
  ┣ Dockerfile (Python)
  ┣ docker-compose.yml (Python)
  ┣ opt
    ┣  test.txt

Dockerfile(Ubuntu)

FROM docker:20.10 as docker
FROM ubuntu:20.04

RUN apt-get -y update && \
		apt-get -y upgrade

RUN apt-get install -y \
		docker-compose

# ホストのdocker daemon共有
COPY --from=docker /usr/local/bin/docker /usr/local/bin/

docker-compose.yml(Ubuntu)

docker-compose.yml
 version: '3'
version: '3'
services:
  alpine:
    restart: always
    build: .
    container_name: 'ubuntu'
    tty: true  
    working_dir: '/work'
    volumes:
      - ./vm:/work/
      - /var/run/docker.sock:/var/run/docker.sock

Dockerfile(Python)

FROM python:3
RUN apt-get update

RUN apt-get install -y vim 
RUN pip install --upgrade pip

docker-compose.yml(Python)

docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/work'
    privileged: true
    tty: true
    volumes:
      - ./opt/:/work/

test.txt

test.txt
hello world

UbuntuコンテナはDocker Desktopのソケットを共有してDockerを利用しています。

そのあと、Python3コンテナに入り、test.txtがあるか確認します。

まずUbuntuコンテナに入ります。

$ docker-compose up -d
$ docker exec -it ubuntu bash

そのあと、docker-in-dockerでPythonコンテナを立ち上げます。

$ docker-compose up -d
$ docker exec -it python3 bash
$ ls # test.txtがない

なぜか共有ができていません。

Dockerfileに以下の行を追加します。

COPY ./opt ./

するとファイルはコピーすることはできました。なぜかマウントだけできません。

また、以下のようにボリュームの設定を変えると

docker-compose.yml
    volumes:
      - ./:/root/opt

$ ls # optディレクトリが存在
$ cd opt
$ ls # test.txtはない

なぜかファイルだけがマウントできないことがわかります。

解決方法

Python3コンテナのボリュームを以下のように変更することで、動くようになりました。

docker-compose.yml
    volumes:
      - /c/Users/jinwa/Desktop/test/vm/opt/:/work/

Ubuntuのマウントするディレクトリを絶対パスで指定しました。
すると、test.txtの存在が確認できました。

ちなみに、Ubuntuのデスクトップまでのパスは人によっては/mnt/c/にあることがあります。
以下の手順で変更してみて下さい。

WSLからDocker Desktop for Windowsを使う

コンテナ内でボリュームに指定した./optでUbuntuコンテナの./optを探しているのではなく、ホスト側(Ubuntu)の./optを見つけようとしている気がします。

また、以下の方法がベストかなと思いました。

まず、Ubuntuコンテナのoptディレクトリに.envを追加します。
そして、vmディレクトリに対応するところまでの絶対パスを環境変数で設定します。

.env

.env
PWD_PATH=/c/Users/jinwa/Desktop/test/vm

そして、docker-compose.ymlを修正します。

docker-compose.yml
    volumes:
      - ${PWD_PATH}/opt/:/work/

これで、同じようにマウントすることができます。
GitにPushするときは.envをPushしないように.gitignoreに追加しましょう。

また、.envは人によって内容が違うためREADMEにその旨と環境変数の設定について記載しましょう。

おわりに

これは気づいてからかなり沼りました。
ですが、ネットにはほぼ記事がなく不思議でした。dindあまりする人がいないのかもしれないですが、、
会社の先輩にアドバイスをもらい試行錯誤して動かせるようにはなってよかったです。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?