有一个相当简单的test.sql
SELECT 'CREATE DATABASE test_dev'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'test_dev')\gexec
\c test_dev
CREATE TABLE IF NOT EXISTS test_table (
username varchar(255)
);
INSERT INTO test_table(username)
VALUES ('test name');按照我的预期做下面的事情:
Dockerfile.dev
FROM postgres:11-alpine
EXPOSE 5432
COPY ./db/*.sql /docker-entrypoint-initdb.d/docker build -t testproj/postgres -f db/Dockerfile.dev .docker run -p 5432:5432 testproj/postgres这将创建数据库,切换到数据库,创建表,并插入值。
现在我试着用库伯内特斯和Skaffold做同样的事情,但是似乎什么都没有发生:没有错误消息,但postgres没有任何变化。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: init-script
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 500Mi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-storage
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10GiapiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
selector:
matchLabels:
component: postgres
template:
metadata:
labels:
component: postgres
spec:
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-storage
- name: init-script
persistentVolumeClaim:
claimName: init-script
containers:
- name: postgres
image: postgres
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
subPath: postgres
- name: init-script
mountPath: /docker-entrypoint-initdb.d
---
apiVersion: v1
kind: Service
metadata:
name: postgres-cluster-ip-service
spec:
type: ClusterIP
selector:
component: postgres
ports:
- port: 5432
targetPort: 5432我在这里做错了什么?
基本上试着遵循这里的答案,但没有被筛选出来。听起来我需要将.sql移动到一个持久的卷。
发布于 2019-12-06 00:01:07
coderanger指出了一个让我走向正确方向的明显错误:我指的不是修改过的图像。
因此,我更新如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
selector:
matchLabels:
component: postgres
template:
metadata:
labels:
component: postgres
spec:
containers:
- name: postgres
image: testproject/postgres
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
subPath: postgres
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-storage
---
apiVersion: v1
kind: Service
metadata:
name: postgres-cluster-ip-service
spec:
type: ClusterIP
selector:
component: postgres
ports:
- port: 5432
targetPort: 5432然后,它开始相应地加载数据。
发布于 2019-11-21 04:45:35
您不希望在入口点文件夹上挂载卷。您基本上是用一个空文件夹掩盖图像中的脚本。另外,您也没有使用您修改过的图像,所以它一开始就不会有您的脚本。
发布于 2019-11-21 10:49:19
我不能百分之百肯定你的形象会在库伯内特斯身上发挥作用。
我建议使用像PostgreSQL图这样的测试工具,而且阅读使用Kubernetes部署PostgreSQL也可能有帮助。
如果您想在Kubernetes中使用您自己的映像,您需要将图像推送到您的私人Docker注册中心或存储库。从私人注册表中提取图像在这里解释了这一点。
至于test.sql,您可以将其存储到ConfigMap中
apiVersion: v1
kind: ConfigMap
metadata:
name: test-sql
data:
test.sql: |
SELECT 'CREATE DATABASE test_dev'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'test_dev')\gexec
\c test_dev
CREATE TABLE IF NOT EXISTS test_table (
username varchar(255)
);
INSERT INTO test_table(username)
VALUES ('test name');之后,您可以将其挂载为init.sql或在创建pod之后执行。
https://stackoverflow.com/questions/58967417
复制相似问题