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 发生的情况相同。
在 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
等的文件)。
所以我认为你有两个选择:
/var/lib/indy/sandbox
到您的/var/kubeshare
. 然后你就保持其他一切不变。这样,该目录将被包含与容器期望在那里找到的数据完全相同的新文件系统所覆盖。 归档时间: |
|
查看次数: |
137 次 |
最近记录: |