Hyperledger Indy 数据未挂载到 Kubernetes 卷目录中

Aks*_*ood 5 docker kubernetes dockerfile hyperledger-indy indy-node

我正在尝试在 kubernetes 中运行 indy-nodes。这些indy节点是沙盒节点,并将数据写入/var/lib/indy容器内的目录中。当我在安装了卷的情况下运行 pod 时,它不会在卷目录中写入任何内容。尽管它在卷内创建了一个目录,但它始终是空的。但是,当我创建一个没有卷挂载选项的 pod 时,容器会在/var/lib/indy.

以下是 Dockerfile:
Hastebin: https: //hastebin.com/hitinefizi.nginx

库伯内特部署:

{{- $root := .}}
{{- range .Values.indy}}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  # namespace: {{$root.Values.namespace}}
  name: {{.name}}
spec:
  selector:
    matchLabels:
      name: {{.name}}
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        name: {{.name}}
    spec:
      containers:
        - name: {{.name}}
          image: {{.image}}
          volumeMounts:
            - name: {{$root.Values.pv.metadata.name}}
              mountPath: "/var/lib/indy/sandbox"
              subPath: "volume/indy/{{.name}}/sandbox"
          ports:
            - containerPort: {{ index .ports 0 }}
            - containerPort: {{ index .ports 1 }}
      nodeSelector:
        nodeType: {{$root.Values.hosts.blockchain}}
      volumes:
        - name: {{$root.Values.pv.metadata.name}}
          {{- if eq $root.Values.storage.type "nfs" }}
          persistentVolumeClaim:
            claimName: {{$root.Values.pvc.metadata.name}}
          {{- else }}
          hostPath:
            path: /var/kubeshare/
          {{- end }}
{{- end}}
Run Code Online (Sandbox Code Playgroud)

卷内目录:

[root@centos1 kubeshare]# tree volume/indy/
volume/indy/
|-- indy-node1
|-- indy-node2
|-- indy-node3
`-- indy-node
Run Code Online (Sandbox Code Playgroud)

/var/lib/indy容器内没有卷的目录:

root@indy-node1-587c4758bf-2hpp6:/var/lib/indy# tree -L 3
.
|-- plugins
`-- sandbox
    |-- data
    |   `-- Node1
    |-- domain_transactions_genesis
    |-- keys
    |   |-- Node1
    |   |-- Node1C
    |   |-- Node2
    |   |-- Node3
    |   `-- Node4
    |-- node1_additional_info.json
    |-- node1_info.json
    |-- node1_version_info.json
    `-- pool_transactions_genesis
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会发生这种情况。任何帮助/建议将不胜感激。

更新:当我尝试使用本地卷时,这与 docker-compose 发生的情况相同。

Pat*_*tas 3

在 docker 中挂载与在 Linux 上挂载的标准行为一致。Linuxmount命令文档说

The previous contents (if any) and owner and mode of dir become invisible, and as long as this filesystem remains mounted

这也是 Docker 中的工作方式。如果挂载本地目录或现有的命名 docker 卷,则挂载位置的容器中的文件系统内容将被隐藏(或者我们可以称之为“覆盖”)。

正在发生的事情的简化示例

有dockerfile

FROM alpine:3.9.6

WORKDIR /home/root/greetings
RUN echo "hello world" > /home/root/greetings/english.txt
CMD sleep 60000
Run Code Online (Sandbox Code Playgroud)

并构建它docker build -t greetings:1.0 .

现在创建以下内容docker-compose.yml

version: '3.7'

services:
  greetings:
    container_name: greetings
    image: greetings:1.0
    volumes:
      - ./empty:/home/root/greetings
Run Code Online (Sandbox Code Playgroud)

empty并在其旁边创建空目录。

启动它docker-compose up -d。当容器运行时,让我们进入容器看看里面的文件结构是什么样的。docker exec -ti greetings sh。现在,当我们进入内部时,如果您运行,ls /home/root/greetings您会看到该目录是空的 - 即使在 Dockerfile 中我们已将文件烘焙/home/root/greetings/english.txt到映像的文件系统中。

如果命名 docker 容器是新的且不包含任何数据,则命名 docker 容器的行为会更理想。如果将此类容器安装在容器中已有一些数据的位置,则指定卷将在其上复制该数据。

您可以通过调整docker-compose.yml到此来尝试此操作

version: '3.7'

services:
  greetings:
    container_name: greetings
    image: greetings:1.0
    volumes:
      - greetingsvol:/home/root/greetings

volumes:
  greetingsvol:
    driver: local
Run Code Online (Sandbox Code Playgroud)

如果您重复该过程并在容器中执行自己,您将看到该文件/home/root/greetings/english.txt仍然存在。

这是因为当您cd自己进入/home/root/greetings时,您查看的不是实际容器的文件系统,而是查看已安装的设备(名称为 docker 卷),该设备已通过给定位置上容器的原始文件的副本进行初始化。(假设 docker 卷greetingsvol以前不存在。)

解决您的问题

您正在将/var/kubeshare主机上的目录安装到容器的/var/lib/indy/sandbox. 让我们看看容器在启动时在该位置存储什么(indypool这是我在本地主机上命名构建的 indy 沙箱映像的方式)

docker run --rm indypool ls /var/lib/indy/sandbox
domain_transactions_genesis
keys
pool_transactions_genesis
Run Code Online (Sandbox Code Playgroud)

因此,如果您将本地目录挂载到/var/lib/indy/sandbox,它将隐藏这些文件,并且池将无法启动(因此不会创建诸如node1_additional_info.json等的文件)。

所以我认为你有两个选择:

  1. 除非您有充分的理由不这样做,否则请使用命名的 docker 卷。
  2. 将原始图像数据从容器复制/var/lib/indy/sandbox到您的/var/kubeshare. 然后你就保持其他一切不变。这样,该目录将被包含与容器期望在那里找到的数据完全相同的新文件系统所覆盖。