我正在尝试在Kubernetes上部署mongodb,但我收到错误:
解析stateful.yaml时出错:将YAML转换为JSON时出错:yaml:第35行:在此上下文中不允许映射值
第35行是容器名称: - name:uat-mongo-primary
当我尝试创建pod但是如果我评论这些行时,我收到此错误:
mongo --eval rs.initiate({_ id:“rs0”,version:1,members:[{_ id:0,host:“uat-mongo-primary-rc-0:27017”}]}); 53 mongo --eval“db.getSiblingDB('admin')。createUser({user:\”$ MONGO_USER \“,pwd:\”$ MONGO_PASSWORD \“,角色:[{role:'root',db:'admin '}]})“;
pod正在正常创建,但我需要启动群集也创建用户和密码。
这是我正在使用的完整yaml文件,我将不胜感激任何帮助:
apiVersion: v1
kind: Service
metadata:
name: uat-mongo-primary
labels:
name: uat-mongo-primary
spec:
type: NodePort
ports:
- port: 27017
targetPort: 27017
protocol: TCP
name: uat-mongo-primary
selector:
name: uat-mongo-primary
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: uat-mongo-primary-rc
labels:
name: uat-mongo-primary-rc
spec:
serviceName: uat-mongo-primary
replicas: 1
template:
metadata:
labels:
role: mongo
environment: test
spec:
containers:
- name: uat-mongo-primary
image: mongo
env:
- name: "MONGO_DATA_DIR"
value: "/data/db"
- name: "MONGO_LOG_DIR"
value: "/data/logs"
- name: MONGO_USER
value: "admin"
- name: MONGO_PASSWORD
value: "password"
command: ["/bin/sh", "-c"]
args:
- echo starting;
ulimit -a;
mongod --replSet rs0 --bind_ip_all;
mongo --eval rs.initiate({_id: "rs0", version: 1, members: [{ _id: 0, host : "uat-mongo-primary-rc-0:27017" }]});
mongo --eval "db.getSiblingDB('admin').createUser({user : \"$MONGO_USER\", pwd : \"$MONGO_PASSWORD\", roles: [ { role: 'root', db: 'admin' } ] })";
ports:
- containerPort: 27017
volumes:
- name: uat-mongo-primary-db
persistentVolumeClaim:
claimName: uat-mongo-primary-pvc
要检查您的yaml文件是否正确呈现,请尝试使用任何YAML到JSON转换器在线工具。因此它将指示哪些字段无效。
不可能使用含有冒号的YAML字符串(至少使用kubectl)。您应该将您的YAML转换为JSON(例如使用this工具)并将该JSON应用于kubectl。
首先,除非你想强制“string”的值,否则不需要使用双引号。这个post有很好的解释
此外,你正在做什么,这不是最好的做法,并且很难在yaml文件中管理如此长的复杂命令。我建议你通过在Dockerfile中添加这些命令来构建自己的Dockerfile并构建自己的镜像。
其他选项是在检查mongo docker文档时,用于初始化新实例
当容器第一次启动时,它将执行扩展名为.sh和.js的文件,这些文件位于/docker-entrypoint-initdb.d中。文件将按字母顺序执行。 .js文件将由mongo使用MONGO_INITDB_DATABASE变量指定的数据库执行(如果存在),否则进行测试。您也可以在.js脚本中切换数据库。
因此,您可以将PV附加到此目录,并在那里添加脚本,然后当容器启动时,它将运行您的脚本。