🐳

Dockerfileに追記してDooD可能にする

に公開

TL;DR

/var/run/docker.sockをマウントして、docker-ce-cliをインストールして、ホストのdockerグループに所属するユーザーで触ればいい

背景

Docker outside of docker、通称doodしたくなることがあった。でも、すでにalmalinux-9をベースイメージにすることを決めていたので、よくあるようにdocker公式イメージにするわけにはいかなかった。

$ ls
Dockerfile
$ docker image build \
    --build-arg UID=`id -u` \
    --build-arg GID=`id -g` \
    --build-arg DOCKERGID=`getent group docker | cut -d: -f3` \
    -t dood-sample
    .
...
$ docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    dood-sample \
    docker run --rm -it hello-world
...
Hello from Docker!
...
Dockerfile
FROM mirror.gcr.io/almalinux/9-base

...
# Localユーザーを追加
ARG USERNAME=developer
ARG GROUPNAME=${USERNAME}
ARG UID=1000
ARG GID=1000
RUN userdel -r $(id -un $UID) || true && \
    groupadd -g ${GID} ${GROUPNAME} && \
    useradd -m -s /bin/bash -u ${UID} -g ${GID} ${USERNAME}

# Docker cliをインストール
RUN dnf -y install dnf-plugins-core \
    && dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo \
    && dnf install -y docker-ce-cli \
    && dnf clean all

# ホストの`docker`グループに参加する必要が
ARG DOCKERGID
RUN groupdel docker || true && \
    groupdel $(getent group ${DOCKERGID} | cut -d: -f1) || true && \
    groupadd -g ${DOCKERGID} docker && \
    usermod -aG docker ${USERNAME}
...

Discussion