我正在尝试在minikube上运行应用程序。为了获得mongo,我正在运行
https://www.www.example.com
使用importdata.sh as:
kubectl create configmap mongo-initdb --from-file=importdata.sh
kubectl apply -f mongo.yaml
和mongo.yaml as:
mongo myapp-dev --eval "db.dropDatabase()"
apt-get update && apt-get install curl && apt-get install bzip2
curl https://cdn.filestackcontent.com/xxxxxxxx -o myapp-db.tar.bz2
bzip2 -dc myapp-db.tar.bz2 | tar xvf -
mongorestore --db myapp-dev myapp-dev
mongo myapp-dev --eval 'db.users.update({}, {$set: {hashedPassword: "fwaPwkoIpS4y4aWA+uljXWIlyjTxUzkU+IgK4+B8m+ZhyBrWwM/N/oGfUj0ERAcwnXCOImkOvbvDMH/BAmN8FA==", salt: "YfnL4jUxfbYY6Y3/w8P8KA=="}}, {multi: true})'
mongo myapp-dev --eval 'db.getCollection("users").dropIndex("bad_index1")'
我的目标是让mongo使用我apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mongo
spec:
template:
metadata:
labels:
app: mongo
spec:
containers:
- image: mongo:3.2
name: mongo
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-initdb
mountPath: /docker-entrypoint-initdb.d
volumes:
- name: mongo-initdb
configMap:
name: mongo-initdb
来自该网址的正确数据运行。但是,当我使用curl
检查日志时,我会看到以下内容:
kubectl logs -f deploy/mongo
如果我在/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/importdata.sh
MongoDB shell version: 3.2.17
connecting to: myapp-dev
2017-10-20T20:00:49.572+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:47118 #2 (1 connection now open)
{ "ok" : 1 }
2017-10-20T20:00:49.576+0000 I NETWORK [conn2] end connection 127.0.0.1:47118 (0 connections now open)
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
/docker-entrypoint-initdb.d/importdata.sh: line 5: curl: command not found
之前添加sudo
,我只会收到apt-get
错误。
如何使用我的数据库正确启动mongo?除了使用sudo: command not found
之外,我对其他解决方案持开放态度。
注:
如果我运行curl
然后在pod中输入命令,这些命令就会起作用!有人可以解释在入口点运行脚本和在pod中运行命令之间的区别吗?
答案 0 :(得分:0)
我不建议使用ConfigMap,而是建议您将脚本结构化为从初始化容器调用的内容,该容器与在同一Pod中托管MongoDB的容器并行运行。
初始化容器出现在Kubernetes 1.6中,所以你至少需要运行这个版本才能利用这个 - 但是使用当前的minikube实例,这应该不是问题。如果您只是将备份加载到位,这可能就足够了,但是正如Janos在评论中指出的那样 - 这些容器都在之前运行 pod已经“准备好”并且在任何常规容器之前按顺序运行在pod上定义。这些pod也必须必须在主容器获得控制权之前退出。
您也可以利用容器生命周期挂钩,这些挂钩在容器启动之前无法保证任何排序,但是可以在Pod启动和标记为“就绪”之间做一些工作(因此添加到服务等)
初始容器有4个文档点,可以让您很好地了解这是什么以及如何操作:
如果你使用init容器,你将需要mongod服务器及其加载工具,虽然我没有尝试过这个特定的过程来写出你将如何处理它。
在一般情况下,我建议专门构建一个容器,其中包含您要执行此数据加载的工具 - 一个包含bzip2
,curl
和mongodb客户端的小容器,以及使该容器的ENTRYPOINT / CMD成为您在上面的ConfigMap设置中当前具有的脚本的核心。但是,由于init容器会在运行mongod之前运行,这对你来说不会那么好......
您可以利用以下事实:同一Pod中的所有容器都链接到相同的环回网络接口和卷,以便与MongoDB通信并加载相关数据。