如何修复K8s Pod内执行docker compose up时的Docker daemon连接问题
问题描述
我希望在Kubernetes Pod内执行docker compose up命令启动Docker Compose,以下是我的Deployment配置:
apiVersion: apps/v1 kind: Deployment metadata: name: test-system labels: app: test name: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: # init-container initContainers: - name: init-docker-compose image: k8s-testsystem-init:origin-main-stable imagePullPolicy: Always securityContext: runAsUser: 0 runAsGroup: 0 command: ["/bin/sh", "-c"] args: ["cp -R /opt/docker /data && chmod -R 777 /data/docker && cat /tmp/.env >> /data/docker/.env"] volumeMounts: - name: compose-files mountPath: /data - name: docker-config mountPath: /tmp containers: # docker - name: docker-test image: docker:latest command: ["/bin/sh", "-c"] args: ["cd /data/docker && docker commpose up"] securityContext: privileged: true ports: - containerPort: 80 - containerPort: 443 - containerPort: 5005 - containerPort: 502 volumeMounts: - name: compose-files mountPath: /data # volumes volumes: # modbus profiles volumes - name: compose-files emptyDir: {} - name: docker-config configMap: name: docker-configmap items: - key: env path: .env
创建该资源后Pod退出并报错:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
但如果移除该命令,通过shell手动启动则一切正常,请问该如何修复这个问题?
修复方案
问题核心是:直接执行docker compose up时,容器内的Docker daemon(dockerd)还未启动;手动进shell操作正常,是因为你大概率先手动启动了daemon进程,再执行compose命令。
具体修改步骤
- 修正命令拼写错误:配置里的
docker commpose up多了一个m,改为docker compose up。 - 先启动Docker daemon并等待就绪:调整启动命令,先让
dockerd后台运行,再等待它完全就绪后执行compose命令。
修改后的容器配置片段:
containers: - name: docker-test image: docker:latest command: ["/bin/sh", "-c"] # 用循环检查替代固定sleep,确保daemon就绪后再启动compose args: ["dockerd & while ! docker info > /dev/null 2>&1; do sleep 1; done && cd /data/docker && docker compose up"] securityContext: privileged: true ports: - containerPort: 80 - containerPort: 443 - containerPort: 5005 - containerPort: 502 volumeMounts: - name: compose-files mountPath: /data
说明
dockerd &:让Docker daemon在后台运行,不阻塞后续命令执行。while ! docker info > /dev/null 2>&1; do sleep 1; done:循环执行docker info检查,直到daemon能正常响应,比固定sleep 10更可靠,避免因环境差异导致的启动不充分问题。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

