Kubernetes(在 Docker for Windows 中)Postgres 的卷配置
Kubernetes (in Docker for Windows) Volume Configuration for Postgres
我有一个 tomcat + postgres 应用程序,我使用 docker-compose 对其进行了测试。我正在尝试将应用程序打包到 kubernetes 配置文件中。
现在,我 运行 kubernetes(和 kubectl)使用我的 Docker 桌面进行 Windows 安装。最终,我想部署到其他环境。
我目前正在尝试在以下配置文件中复制 docker-compose 中的一些卷功能。
apiVersion: v1
kind: Pod
metadata:
name: pg-pod
spec:
volumes:
- name: "pgdata-vol"
#emptyDir: {}
hostPath:
path: /c/temp/vols/pgdata
containers:
- image: postgres
name: db
ports:
- containerPort: 5432
name: http
protocol: TCP
volumeMounts:
- mountPath: "/pgdata"
name: "pgdata-vol"
env:
- name: PGDATA
value: /pgdata
当 postgres 启动时,我看到以下错误。
fixing permissions on existing directory /pgdata ... ok
creating subdirectories ... ok
selecting default max_connections ... 20
selecting default shared_buffers ... 400kB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
2019-07-26 20:43:41.844 UTC [78] FATAL: data directory "/pgdata" has wrong ownership
2019-07-26 20:43:41.844 UTC [78] HINT: The server must be started by the user that owns the data directory.
child process exited with exit code 1
initdb: removing contents of data directory "/pgdata"
running bootstrap script ...
我想我要么需要为我的卷定义提供一些额外的参数,要么我需要尝试不同类型的卷配置(local vs hostPath ).
这是 Windows 上 Docker 图片的已知问题。现在无法将 Windows 目录正确挂载为卷。但是,您可以尝试使用永久 Docker 卷来解决它。例如:
db:
image: postgres
environment:
- POSTGRES_USER=<user>
- POSTGRES_PASSWORD=<pass>
- POSTGRES_DB=<db_name>
ports:
- <ports>
volumes:
- pgdata:<path>
networks:
- <network>
volumes:
pgdata:
更多信息:
- data directory "/var/lib/postgresql/data" has wrong ownership
- postgresql-data-pgdata-has-wrong-ownership
- postgres-to-work-on-persistent-windows-mount
如果有帮助,请告诉我。
您尝试过使用 WSL 吗? windows 我的设置是 WSL + Ubuntu + Docker for windows 我可以正常挂载卷。
我已经按照该教程配置了我的所有环境:
https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly
我找到了这个问题的部分解决方案。
有趣的是,如果我指定一个 linux 风格的路径作为我的主机路径(在 Windows 上),那么我的 pgdata-vol 会一直存在,直到 Docker 桌面重新启动。
而不是安装到真实的 windows 位置
volumes:
- name: "pgdata-vol"
hostPath:
path: /c/temp/vols/pgdata
我使用 "linux" 位置作为我的 Windows hostPath
volumes:
- name: "pgdata-vol"
hostPath:
path: /tmp/vols/pgdata
奇怪的是,我实际上无法从 Windows 中找到这条路径。我假设这个 /tmp 是我的 Docker 桌面实例的本地文件。
此解决方案不提供真正的持久性,但它帮助我解决了影响测试的障碍。
我有一个 tomcat + postgres 应用程序,我使用 docker-compose 对其进行了测试。我正在尝试将应用程序打包到 kubernetes 配置文件中。
现在,我 运行 kubernetes(和 kubectl)使用我的 Docker 桌面进行 Windows 安装。最终,我想部署到其他环境。
我目前正在尝试在以下配置文件中复制 docker-compose 中的一些卷功能。
apiVersion: v1
kind: Pod
metadata:
name: pg-pod
spec:
volumes:
- name: "pgdata-vol"
#emptyDir: {}
hostPath:
path: /c/temp/vols/pgdata
containers:
- image: postgres
name: db
ports:
- containerPort: 5432
name: http
protocol: TCP
volumeMounts:
- mountPath: "/pgdata"
name: "pgdata-vol"
env:
- name: PGDATA
value: /pgdata
当 postgres 启动时,我看到以下错误。
fixing permissions on existing directory /pgdata ... ok
creating subdirectories ... ok
selecting default max_connections ... 20
selecting default shared_buffers ... 400kB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
2019-07-26 20:43:41.844 UTC [78] FATAL: data directory "/pgdata" has wrong ownership
2019-07-26 20:43:41.844 UTC [78] HINT: The server must be started by the user that owns the data directory.
child process exited with exit code 1
initdb: removing contents of data directory "/pgdata"
running bootstrap script ...
我想我要么需要为我的卷定义提供一些额外的参数,要么我需要尝试不同类型的卷配置(local vs hostPath ).
这是 Windows 上 Docker 图片的已知问题。现在无法将 Windows 目录正确挂载为卷。但是,您可以尝试使用永久 Docker 卷来解决它。例如:
db:
image: postgres
environment:
- POSTGRES_USER=<user>
- POSTGRES_PASSWORD=<pass>
- POSTGRES_DB=<db_name>
ports:
- <ports>
volumes:
- pgdata:<path>
networks:
- <network>
volumes:
pgdata:
更多信息:
- data directory "/var/lib/postgresql/data" has wrong ownership
- postgresql-data-pgdata-has-wrong-ownership
- postgres-to-work-on-persistent-windows-mount
如果有帮助,请告诉我。
您尝试过使用 WSL 吗? windows 我的设置是 WSL + Ubuntu + Docker for windows 我可以正常挂载卷。
我已经按照该教程配置了我的所有环境:
https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly
我找到了这个问题的部分解决方案。
有趣的是,如果我指定一个 linux 风格的路径作为我的主机路径(在 Windows 上),那么我的 pgdata-vol 会一直存在,直到 Docker 桌面重新启动。
而不是安装到真实的 windows 位置
volumes:
- name: "pgdata-vol"
hostPath:
path: /c/temp/vols/pgdata
我使用 "linux" 位置作为我的 Windows hostPath
volumes:
- name: "pgdata-vol"
hostPath:
path: /tmp/vols/pgdata
奇怪的是,我实际上无法从 Windows 中找到这条路径。我假设这个 /tmp 是我的 Docker 桌面实例的本地文件。
此解决方案不提供真正的持久性,但它帮助我解决了影响测试的障碍。