Ich versuche, einen Docker in einem Docker-Szenario in einem von Azure verwalteten Kubernetes-Cluster (AKS) auszuführen.
Ich habe den Docker-Unix-Socket am Pod montiert. Ich beabsichtige, AKS-Pods als Azure DevOps-Agenten zu verwenden, um mein Projekt zu erstellen und zu testen. Dies erfordert eine Datenbank und ein Wiremock, das in Docker ausgeführt wird, was bedeutet, dass ein Docker-Netzwerk erstellt wird.
Unten sehen Sie meine aktuelle Konfiguration:
Name: my-devopsagent-javaagent-64855bb796-smpkz
Namespace: my-devops-agents
Priority: 0
Node: aks-default-21935887-vmss000000/10.128.0.4
Start Time: Mon, 16 Dec 2019 14:09:04 +0200
Labels: app=my-devopsagent-javaagent
pod-template-hash=64855bb796
Annotations: <none>
Status: Running
IP: 10.128.0.28
IPs: <none>
Controlled By: ReplicaSet/my-devopsagent-javaagent-64855bb796
Containers:
my-devopsagent-javaagent:
Container ID: docker://ffffff26c3b4a92678a95f446c0ada685986f30c56138109b080
Image: mycontainerregistry.azurecr.io/mycompany/devopsagent/javaagent:latest
Image ID: docker-pullable://mycontainerregistry.azurecr.io/mycompany/devopsagent/javaagent@sha256:4422edb12d1b4bbff92bc36e7d33715222daab6ef3439cfffffff
Port: <none>
Host Port: <none>
State: Running
Started: Mon, 16 Dec 2019 14:09:06 +0200
Ready: True
Restart Count: 0
Environment:
AZP_AGENT_NAME: CONTAINER_JAVA_AGENT
AZP_URL: https://dev.azure.com/mycompany
AZP_POOL: Default
AZP_TOKEN: <set to the key 'pat' in secret 'pat'> Optional: false
Mounts:
/var/run/docker.sock from dockersock (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-2msgf (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
dockersock:
Type: HostPath (bare host directory volume)
Path: /var/run/docker.sock
HostPathType:
default-token-2msgf:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-2msgf
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>
der Fehler, den ich erhalte, ist
ERRO[0000] 'overlay' is not supported over overlayfs
error creating libpod runtime: 'overlay' is not supported over overlayfs: backing file system is unsupported for this graph driver
Irgendwelche Ideen, wie ich dieses Problem lösen kann?
PS Ich habe auch versucht, den ersten Kommentar in derDocker in DockerProblem, d. h. ich habe versucht, /bin/docker zu mounten, was verschiedene Probleme verursacht hat
Antwort1
Um Docker in Docker auszuführen, kann das /var/lib/docker
Dateisystem nicht das Container-Dateisystem sein, das mit einem Overlay-FS erstellt wurde. Stattdessen müssen Sie dieses von einem externen Volume in ein unterstütztes Dateisystem auf dem externen Host mounten, entweder xfs
mit ftype=1
oder ext4
. Dies ist dokumentiert unterhttps://docs.docker.com/storage/storagedriver/#supported-backing-filesystems
Sie können hierfür ein benanntes Volume auf dem Host verwenden, da /var/lib/docker auf dem Host-Dateisystem auf einem unterstützten FS liegt. Meine eigene DinD-CLI sieht beispielsweise so aus:
docker run -d --rm --privileged \
-v "dind-${port}:/var/lib/docker" \
-v "dind-${port}-ccerts:/certs/client" -e DOCKER_TLS_CERTDIR=/certs \
-v "$HOME:$HOME" \
--name "dind-${port}" -p "127.0.0.1:${port}:2376" \
"docker:${opt_t}-dind"
Beachten Sie, dass bei der ersten Volume-Einbindung etwa Folgendes angezeigt wird: dind-1234:/var/lib/docker
Es wird ein benanntes Volume für dieses Verzeichnis im Container erstellt.