Gelernt - Ansible Molecule und Docker
Ich deploye seit einiger Zeit meine Docker Container auf das NAS mit Ansible. Dabei gibt es je Applikation eine eigene Ansible-Role, in der dann die docker-compose Datei liegt und die notwendige Konfiguration.
Synology hatte lange eine veraltete Docker Version eingesetzt, so dass ich auf dem NAS immer docker und docker compose via pip installieren musste.
Inzwischen haben sie aber im DSM eine aktuelle Docker Version integriert, was die Verwendgung von pip docker obsolet machte.
Gleichzeitig konnte ich so auf Version 2 vom Docker community Plugin umsteigen. Damit liefen die molecule Tests aber nicht mehr:
Für molecule hatte ich hier das docker - image geerlingguy/docker-debian10-ansible:latest eingesetzt. Dort lief das gleiche setup wie vorher mit dem NAS - docker und docker-compose wurde via pip installiert.
community.docker.docker_compose_v2 hingegen hat eine Konfigurationsvariable docker_cli, die in diesem Setup nicht gesetzt werden kann. Ein anderes Docker-Image für die molecule-Tests musste her.
Unzählige Suchen im Netz lieferten keine lauffähigen Lösungen, ich vertagte das Problem bis jetzt.
Das eigentliche Problem ist, dass ich ein image benötige, das docker in docker (DIND) unterstützt - und da gibt es auch bereits ein fertiges docker:dind. Das bringt aber keine Laufzeitumgebung für Ansible mit.
Da ich nun wusste, wonach ich suchen musste, fand ich schnell das image ghcr.io/polar-team/diffusion-molecule-container:latest. So richtig zufriedenstellend war das nicht. Es war mir zu sehr auf die Bedürfnisse vom polar-team zugeschnitten - aber es funktionierte schon mal.
Hier setzte ich nun mit meinem LLM-Assistenten an.
Der Prompt
I like to create a docker image for ansible testing with molecule. It should derive from the official docker:dind image. provide a Dockerfile.
erzeugte mir ein einfaches Dockerfile zum Start.
Die nächsten Aufgaben waren, einen dedizierten Ansible - Nutzer hinzuzufügen und diesem Berechtigungen zu geben, dass er docker auch verwenden kann.
Das Ergebnis ist hier:
Das Dockerfile
FROM docker:dind
# Install Python and dependencies for Ansible
RUN apk add --no-cache \
python3 \
py3-pip \
bash \
git \
openssh-client \
sshpass \
rsync \
sudo
# Create virtual environment directory
RUN python3 -m venv /opt/uv/.venv
# Install Ansible and Molecule in virtual environment
RUN /opt/uv/.venv/bin/pip install --no-cache-dir \
ansible \
molecule \
molecule-docker \
docker
# Create necessary directories
RUN mkdir -p /tmp/ansible/docker /tmp/ansible/secrets
# Create ansible user and group for molecule tests
RUN addgroup -g 1000 ansible && \
adduser -D -u 1000 -G ansible -s /bin/bash ansible && \
addgroup ansible docker && \
echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Copy custom entrypoint script
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
# Set Python interpreter as environment variable
ENV ANSIBLE_PYTHON_INTERPRETER=/opt/uv/.venv/bin/python
# Use custom entrypoint that handles Docker socket permissions
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["tail", "-f", "/dev/null"]entrypoint.sh
#!/bin/bash
set -e
# Start Docker daemon in background
dockerd-entrypoint.sh &
# Wait for Docker socket to be available
echo "Waiting for Docker daemon to start..."
timeout=30
while [ ! -S /var/run/docker.sock ] && [ $timeout -gt 0 ]; do
sleep 1
timeout=$((timeout - 1))
done
if [ ! -S /var/run/docker.sock ]; then
echo "Docker socket not available after 30 seconds"
exit 1
fi
# Ensure Docker socket has correct permissions
chmod 666 /var/run/docker.sock
# Wait for Docker daemon to be fully ready
echo "Waiting for Docker daemon to be ready..."
timeout=30
until docker info > /dev/null 2>&1 || [ $timeout -eq 0 ]; do
sleep 1
timeout=$((timeout - 1))
done
if [ $timeout -eq 0 ]; then
echo "Docker daemon not ready after 30 seconds"
exit 1
fi
echo "Docker daemon is ready"
# Execute the command passed to the container
exec "$@"Das ganze lebt jetzt auf meinem eigenen git-server und wird in seine docker-registry deployt.