无法在docker mongo initdb脚本中运行apt-get

时间:2017-10-23 18:39:45

标签: mongodb docker kubernetes kubectl minikube

我正在尝试在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中运行命令之间的区别吗?

1 个答案:

答案 0 :(得分:0)

我不建议使用ConfigMap,而是建议您将脚本结构化为从初始化容器调用的内容,该容器与在同一Pod中托管MongoDB的容器并行运行。

初始化容器出现在Kubernetes 1.6中,所以你至少需要运行这个版本才能利用这个 - 但是使用当前的minikube实例,这应该不是问题。如果您只是将备份加载到位,这可能就足够了,但是正如Janos在评论中指出的那样 - 这些容器都在之前运行 pod已经“准备好”并且在任何常规容器之前按顺序运行在pod上定义。这些pod也必须必须在主容器获得控制权之前退出。

您也可以利用容器生命周期挂钩,这些挂钩在容器启动之前无法保证任何排序,但是可以在Pod启动和标记为“就绪”之间做一些工作(因此添加到服务等)

初始容器有4个文档点,可以让您很好地了解这是什么以及如何操作:

如果你使用init容器,你将需要mongod服务器及其加载工具,虽然我没有尝试过这个特定的过程来写出你将如何处理它。

在一般情况下,我建议专门构建一个容器,其中包含您要执行此数据加载的工具 - 一个包含bzip2curl和mongodb客户端的小容器,以及使该容器的ENTRYPOINT / CMD成为您在上面的ConfigMap设置中当前具有的脚本的核心。但是,由于init容器会在运行mongod之前运行,这对你来说不会那么好......

您可以利用以下事实:同一Pod中的所有容器都链接到相同的环回网络接口和卷,以便与MongoDB通信并加载相关数据。