🌟
DooD(docker outside of docker)環境でdocker composeができない場合の対処法
先に結論を書くと、僕の場合はマウント先のパスがホストと違うのが原因だったので、同じパスにもマウントすることにしました。ちょっとゴリ押し感が強いのでもっといい方法があれば教えてください。
各バージョン
$ docker -v
Docker version 24.0.5, build ced0996
$ docker compose version
Docker Compose version v2.19.1
ディレクトリ構成
- docker-compose-files/ ・・・コンテナ内で動かすdocker-compose.ymlたち
- docker-compose.hoge.yml
- docker-compose.yml ・・・DooDするコンテナの設定
- Dockerfile ・・・DooDするためのDockerfile
各ファイル
docker-compose.yml
DooDするコンテナ
docker-compose.yml
version: '3.8'
services:
dood:
build:
context: .
dockerfile: Dockerfile
container_name: dood
environment:
# 環境変数にホストのルートパスを設定する
- HOST_ROOT_PATH=$PWD
volumes:
- .:/app
# doodをするための設定
- /var/run/docker.sock:/var/run/docker.sock
# ホストのdocker-compose.ymlファイルのディレクトリパスと同じパスに配置
- ./docker-compose-files:$PWD/docker-compose-files
command: /bin/sh
tty: true
Dockerfile
nodeのイメージを使っていますが、使うイメージは何でもいいです。debian系ならこのまま流用できると思います。
Dockerfile
FROM node:18.16
ENV ROOT=/app
ENV LANG=C.UTF-8
ENV TZ=Asia/Tokyo
WORKDIR ${ROOT}
# Docker CLIのインストール
RUN apt update
RUN apt-get -y install \
ca-certificates \
gnupg \
lsb-release
RUN mkdir -m 0755 -p /etc/apt/keyrings
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
RUN echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt update
RUN apt -y install docker-ce-cli docker-compose-plugin
# 毎回ディレクトリ指定するのは面倒なのでaliasを設定
RUN echo "alias dch='docker compose -f \$HOST_ROOT_PATH/docker-compose-files/docker-compose.hoge.yml'" >> ~/.bashrc
各プロジェクトのdocker-compose.yml
DooD内で操作するコンテナ
docker-compose-files/docker-compose.hoge.yml
version: '3.8'
services:
hello:
image: hello-world:latest
動作確認
aliasを使っています。dch
は$HOST_ROOT_PATH/docker-compose-files/docker-compose.hoge.yml
と同じです(Dockerfileで設定してます)。
# 起動
$ docker compose up -d
# DooDコンテナに入る
$ docker compose exec dood bash
# docker-compose.hoge.ymlを起動すると、hello-worldコンテナが起動したことが確認できる
$ dch up
[+] Running 2/0
✔ Network docker-compose-files_default Created 0.0s
✔ Container docker-compose-files-hello-1 Created 0.0s
Attaching to docker-compose-files-hello-1
docker-compose-files-hello-1 |
docker-compose-files-hello-1 | Hello from Docker!
docker-compose-files-hello-1 | This message shows that your installation appears to be working correctly.
docker-compose-files-hello-1 |
docker-compose-files-hello-1 | To generate this message, Docker took the following steps:
docker-compose-files-hello-1 | 1. The Docker client contacted the Docker daemon.
docker-compose-files-hello-1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
docker-compose-files-hello-1 | (amd64)
docker-compose-files-hello-1 | 3. The Docker daemon created a new container from that image which runs the
docker-compose-files-hello-1 | executable that produces the output you are currently reading.
docker-compose-files-hello-1 | 4. The Docker daemon streamed that output to the Docker client, which sent it
docker-compose-files-hello-1 | to your terminal.
docker-compose-files-hello-1 |
docker-compose-files-hello-1 | To try something more ambitious, you can run an Ubuntu container with:
docker-compose-files-hello-1 | $ docker run -it ubuntu bash
docker-compose-files-hello-1 |
docker-compose-files-hello-1 | Share images, automate workflows, and more with a free Docker ID:
docker-compose-files-hello-1 | https://hub.docker.com/
docker-compose-files-hello-1 |
docker-compose-files-hello-1 | For more examples and ideas, visit:
docker-compose-files-hello-1 | https://docs.docker.com/get-started/
docker-compose-files-hello-1 |
docker-compose-files-hello-1 |
docker-compose-files-hello-1 exited with code 0
Discussion