はじめに
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)
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)
version: '3'
services:
python3:
restart: always
build: .
container_name: 'python3'
working_dir: '/work'
privileged: true
tty: true
volumes:
- ./opt/:/work/
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 ./
するとファイルはコピーすることはできました。なぜかマウントだけできません。
また、以下のようにボリュームの設定を変えると
volumes:
- ./:/root/opt
$ ls # optディレクトリが存在
$ cd opt
$ ls # test.txtはない
なぜかファイルだけがマウントできないことがわかります。
解決方法
Python3コンテナのボリュームを以下のように変更することで、動くようになりました。
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
PWD_PATH=/c/Users/jinwa/Desktop/test/vm
そして、docker-compose.ymlを修正します。
volumes:
- ${PWD_PATH}/opt/:/work/
これで、同じようにマウントすることができます。
Git
にPushするときは.env
をPushしないように.gitignore
に追加しましょう。
また、.envは人によって内容が違うためREADME
にその旨と環境変数の設定について記載しましょう。
おわりに
これは気づいてからかなり沼りました。
ですが、ネットにはほぼ記事がなく不思議でした。dindあまりする人がいないのかもしれないですが、、
会社の先輩にアドバイスをもらい試行錯誤して動かせるようにはなってよかったです。