You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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命令。

具体修改步骤

  1. 修正命令拼写错误:配置里的docker commpose up多了一个m,改为docker compose up。
  2. 先启动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:10:55