Docker Kubernetes:通过主机路径装载的可执行文件失败,并发现错误

Docker Kubernetes:通过主机路径装载的可执行文件失败,并发现错误,docker,kubernetes,minikube,Docker,Kubernetes,Minikube,我试图从我的吊舱运行docker来启动docker容器(k8s内的docker)。为了从主机获取docker图像,我通过hostPath在我的pod中安装docker.sock和docker命令。即使我找到了挂载的文件,但无法执行docker命令,它也会失败,并出现command not found错误 apiVersion: v1 kind: Pod metadata: name: alphine labels: app: alphine spec: containers:

我试图从我的吊舱运行docker来启动docker容器(k8s内的docker)。为了从主机获取docker图像,我通过hostPath在我的pod中安装docker.sock和docker命令。即使我找到了挂载的文件,但无法执行docker命令,它也会失败,并出现command not found错误

apiVersion: v1
kind: Pod
metadata:
  name: alphine
  labels:
    app: alphine
spec:
  containers:
  - name: alpine
    image: alpine
    securityContext:
      privileged: true
    volumeMounts:
    - name: tmp
      mountPath: /tmp
    - name: docker-sock
      mountPath: /var/run/docker.sock
    - name: docker-cmd  # docker command from host.
      mountPath: /usr/bin/docker
    - name: lib64  # for running docker from the host.
      mountPath: /lib64
      readOnly: true
    - name: usr-lib64  # for running docker from the host.
      mountPath: /usr/lib64
      readOnly: true
    command: ["sleep", "infinity"]
  volumes:
  - name: tmp
    emptyDir: {}
  - name: docker-cmd
    hostPath:
      path: /usr/bin/docker
      type: File
  - name: lib64
    hostPath:
      path: /lib64
      type: Directory
  - name: usr-lib64
    hostPath:
      path: /usr/lib64
      type: Directory
  - name: docker-sock
    hostPath:
      path: /var/run/docker.sock
      type: Socket
我用下面的命令盯着minikube

minikube start --memory=16g --cpus=2 --disk-size=10g \
  -p mycluster \
  --extra-config=apiserver.enable-admission-plugins=PodSecurityPolicy \
  --addons=pod-security-policy --wait=all
 docker create
      --name=mypod
      --read-only
      --restart=on-failure
      -v /usr/bin/docker:/usr/bin/docker:ro
      -v /lib64:/lib64:ro
      -v /usr/lib64:/usr/lib64:ro
      -v /var/run/docker.sock:/var/run/docker.sock
      alphine

docker start mypod
这同样适用于Docker环境中的Docker。在这里,我将使用以下命令启动容器

minikube start --memory=16g --cpus=2 --disk-size=10g \
  -p mycluster \
  --extra-config=apiserver.enable-admission-plugins=PodSecurityPolicy \
  --addons=pod-security-policy --wait=all
 docker create
      --name=mypod
      --read-only
      --restart=on-failure
      -v /usr/bin/docker:/usr/bin/docker:ro
      -v /lib64:/lib64:ro
      -v /usr/lib64:/usr/lib64:ro
      -v /var/run/docker.sock:/var/run/docker.sock
      alphine

docker start mypod

我是不是遗漏了什么?如有任何提示/参考,不胜感激。提前感谢。

您的minikube群集的主机路径与您的本地计算机不同。在本地计算机上运行
docker
命令时,它使用存在文件/目录的计算机的主机路径。但是这些文件/目录不存在于minkube集群节点中

解决方案:

  • 创建Dockerfile并在生成映像时复制文件/目录:
  • 在pod中使用此图像:

  • 来宾操作系统似乎有所不同。我尝试了
    Ubuntu:latest
    而不是
    alpine
    作为我的来宾映像,我能够从我的来宾访问docker命令


    不确定这两个客户操作系统之间是否存在任何安全性差异

    如果需要启动其他容器,请使用Kubernetes API来完成。在Kubernetes管理的节点上尝试混合Docker命令不能保证可靠工作。如图所示的注入主机命令即使在普通Docker中也不能可靠地工作,在Kubernetes中,也不能保证每个节点在相同的位置都有相同版本的相同二进制文件(通常,根本不使用
    hostPath
    卷)。