如何将主机目录动态挂载到 OSX 上的 docker 桌面 k8s 部署中?
How can I dynamically mount a host directory into a docker desktop k8s deployment on OSX?
我的团队并没有将我们所有的代码都放在本地的同一个地方,但我们都在为同一个服务工作。此服务依赖于其他一些库,在开发过程中,将这些库的实时版本安装到 pod 中以加快迭代速度会很棒。
路径如何变为动态并不重要,env var、config map、奇怪的卷安装魔法等...
我目前的方法是使用 helm 来模板化 yaml。我希望能够做这样的事情:
volumes:
- name: my-lib
hostPath:
path: $CODE_PATH/my_lib
volumeMounts:
- name: my-lib
mountPath: /tmp/my_lib
我的团队成员可以在外部定义 CODE_PATH
,允许他们指向保存代码的位置。我不喜欢这样做的方法。目前,我的无论如何都不起作用。我只需要能够将主机目录挂载到 pod 中,而无需在 yaml 中静态定义绝对路径。
根据官方文档,有两种方法可以实现此目的,但在这两种方法中都必须定义 hostPath
。
第一种方法是使用hostPath,其中hostPath
卷使用节点的本地磁盘挂载卷并在Preferences->File Sharing中指定hostPath
Docker桌面。
第二种方法是使用 PersistentVolume 方法,在该方法中,集群管理员创建卷并且 pods 可以通过 PersistentVolumeClaims
访问它们,这是卷与其自身之间的抽象级别存储机制。
我相信@Jakub Siemaszko 有一个更正确的答案来解决这个问题而无需任何额外的工具,但我会 post 在他们的答案出现之前我最终开发的解决方案。
我们使用 Makefiles 并为我们的开发环境提供 .env 文件,所以我最后只是告诉人们将他们保存 repo 的路径放入 .env 并使用 Makefile 注入 var。
~/.user.env
USER_CODE_PATH=/Users/LISTERINE/dev
helm/Makefile
# Attempt to export users vars into the make context
ifneq (,$(wildcard ~/.user.env))
include ~/.user.env
export
endif
template:
helm template webapp . -f dev-values.yaml --dry-run --set userCodePath=$(USER_CODE_PATH)
helm/dev-values.yaml
env: "dev"
codeVolumes:
# Code volumes are use to mount our source code into the pod.
# Auto volumes specify the name of the dir that will be mounted into.
# Auto volumes are sourced from your USER_CODE_PATH
auto:
- name: "my-db-lib"
dir: "my-db-lib"
module: "my_db_lib"
helm/templates/deployment.yaml
...
spec:
...
template:
...
spec:
...
containers:
- name: ...
volumeMounts:
{{- range .Values.codeVolumes.auto }}
- name: {{ .name }}
mountPath: "/usr/local/lib/python3.8/site-packages/{{ .module }}"
{{- end }}
...
volumes:
{{- if eq .Values.env "dev" }}
{{- range .Values.codeVolumes.auto }}
- name: {{ .name }}
hostPath:
path: "{{ $.Values.userCodePath }}/{{ .dir }}/{{ .module }}"
{{- end }}
{{- end }}
...
其中的关键部分是 Makefile 能够解析在存储库外部定义的环境变量,并将它们导出到 makefile 上下文中,以便可以使用 --set
将它们传递到 helm 模板上下文中.
helm/templates/deployment.yaml
中的部分受到保护,如果它是 运行 in dev.
,则仅尝试获取用户代码挂载
我的团队并没有将我们所有的代码都放在本地的同一个地方,但我们都在为同一个服务工作。此服务依赖于其他一些库,在开发过程中,将这些库的实时版本安装到 pod 中以加快迭代速度会很棒。
路径如何变为动态并不重要,env var、config map、奇怪的卷安装魔法等...
我目前的方法是使用 helm 来模板化 yaml。我希望能够做这样的事情:
volumes:
- name: my-lib
hostPath:
path: $CODE_PATH/my_lib
volumeMounts:
- name: my-lib
mountPath: /tmp/my_lib
我的团队成员可以在外部定义 CODE_PATH
,允许他们指向保存代码的位置。我不喜欢这样做的方法。目前,我的无论如何都不起作用。我只需要能够将主机目录挂载到 pod 中,而无需在 yaml 中静态定义绝对路径。
根据官方文档,有两种方法可以实现此目的,但在这两种方法中都必须定义 hostPath
。
第一种方法是使用hostPath,其中hostPath
卷使用节点的本地磁盘挂载卷并在Preferences->File Sharing中指定hostPath
Docker桌面。
第二种方法是使用 PersistentVolume 方法,在该方法中,集群管理员创建卷并且 pods 可以通过 PersistentVolumeClaims
访问它们,这是卷与其自身之间的抽象级别存储机制。
我相信@Jakub Siemaszko 有一个更正确的答案来解决这个问题而无需任何额外的工具,但我会 post 在他们的答案出现之前我最终开发的解决方案。
我们使用 Makefiles 并为我们的开发环境提供 .env 文件,所以我最后只是告诉人们将他们保存 repo 的路径放入 .env 并使用 Makefile 注入 var。
~/.user.env
USER_CODE_PATH=/Users/LISTERINE/dev
helm/Makefile
# Attempt to export users vars into the make context ifneq (,$(wildcard ~/.user.env)) include ~/.user.env export endif template: helm template webapp . -f dev-values.yaml --dry-run --set userCodePath=$(USER_CODE_PATH)
helm/dev-values.yaml
env: "dev" codeVolumes: # Code volumes are use to mount our source code into the pod. # Auto volumes specify the name of the dir that will be mounted into. # Auto volumes are sourced from your USER_CODE_PATH auto: - name: "my-db-lib" dir: "my-db-lib" module: "my_db_lib"
helm/templates/deployment.yaml
... spec: ... template: ... spec: ... containers: - name: ... volumeMounts: {{- range .Values.codeVolumes.auto }} - name: {{ .name }} mountPath: "/usr/local/lib/python3.8/site-packages/{{ .module }}" {{- end }} ... volumes: {{- if eq .Values.env "dev" }} {{- range .Values.codeVolumes.auto }} - name: {{ .name }} hostPath: path: "{{ $.Values.userCodePath }}/{{ .dir }}/{{ .module }}" {{- end }} {{- end }} ...
其中的关键部分是 Makefile 能够解析在存储库外部定义的环境变量,并将它们导出到 makefile 上下文中,以便可以使用 --set
将它们传递到 helm 模板上下文中.
helm/templates/deployment.yaml
中的部分受到保护,如果它是 运行 in dev.