🌟

DooD(docker outside of docker)環境でdocker composeができない場合の対処法

2023/07/26に公開

先に結論を書くと、僕の場合はマウント先のパスがホストと違うのが原因だったので、同じパスにもマウントすることにしました。ちょっとゴリ押し感が強いのでもっといい方法があれば教えてください。

各バージョン

$ 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