代码之家  ›  专栏  ›  技术社区  ›  Navin Chandra

为什么docker和docker compose在访问/opt目录时会给出不同的结果?

  •  1
  • Navin Chandra  · 技术社区  · 2 年前

    我有一个docker compose文件,其中包含2个容器,在第二个容器开始之前,完成第一个容器是必不可少的。

    如果我运行以下docker命令: docker run -v /opt/kubearmor/BPF:/opt/kubearmor/BPF --privileged kubearmor/kubearmor-init:stable 它将编译当前内核的bpf代码,并将文件输出为 /opt/kubearmor/BPF/system_monitor.bpf.o 。然后第二个容器将使用此文件。

    如果在向添加了必要的读/写权限后运行上述docker命令 /opt/kubearmor/ 目录中,它成功运行并输出文件。

    但如果我将其作为以下内容的一部分运行 docker-compose.yaml 文件,第一个容器无法创建 system_monitor.bpf.o 所需目录中的文件。

    docker-compose.yaml

    services:
      kubearmor-init:
        image: kubearmor/kubearmor-init:stable
        privileged: true
        volumes:
          - /opt/kubearmor/BPF:/opt/kubearmor/BPF
        entrypoint: ["/bin/sh", "-c", "echo 'Init container done' && sleep 10"]
    
      kubearmor:
        image: kubearmor/kubearmor:latest
        command: ["-k8s=false"]
        depends_on:
          kubearmor-init:
            condition: service_completed_successfully
        privileged: true
        pid: "host"
        ipc: "host"
        network_mode: "host"
        volumes:
          - /opt/kubearmor/BPF:/opt/kubearmor/BPF
          - /sys/fs/bpf:/sys/fs/bpf
          - /sys/kernel/security:/sys/kernel/security
          - /sys/kernel/debug:/sys/kernel/debug
          - /var/run/containerd/containerd.sock:/var/run/containerd/containerd.sock
          - /run/containerd:/run/containerd
          - /var/lib/docker:/var/lib/docker
    
    

    结果,第二个容器给出错误:

    kubearmor-1       | 2024-05-20 15:18:52.494014  ERROR   Failed to initialize BPF (cannot load bpf module specs open /opt/kubearmor/BPF/system_monitor.bpf.o: no such file or directory)
    
    

    我尝试授予对的完全读/写访问权限 opt/kubearmor/BPF 目录,但它适用于单机版 docker 仅用于命令,不用于 docker-compose 方法

    1 回复  |  直到 2 年前
        1
  •  1
  •   pdoherty926    2 年前

    看起来您正在覆盖 kubearmor-init 使用Compose时图像的默认入口点。

    The image 使用: ENTRYPOINT ["/KubeArmor/compile.sh"]

    …而您的服务正在使用: ENTRYPOINT ["/bin/sh", "-c", "echo 'Init container done' && sleep 10"] ,它覆盖默认值,并且不输出所需的文件 kubearmor 服务

    如果你改变 entrypoint command 在您的 kubearmor初始化 服务定义或在您的 echo ,文件 应该 被输出到/opt/。。。正如预期的那样。

    推荐文章