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

我正在尝试在minikube上运行一个应用程序。 为了让蒙戈起来,我正在跑步

kubectl create configmap mongo-initdb --from-file=importdata.sh kubectl apply -f mongo.yaml 

用importdata.sh作为:

 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.yaml一样:

 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 

我的目标是让mongo运行正确的数据,我从这个URL curl 。 但是,当我用kubectl logs -f deploy/mongo检查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 

如果我在apt-get s之前添加sudo ,我只会得到sudo: command not found错误。

我怎样才能正确启动我的数据库的mongo? 除了使用curl之外,我也接受其他解决scheme。

注意:

如果我运行kubectl exec -it mongo-xxxxx bash ,然后在pod中input命令,这些命令可以工作! 有人可以解释一下在入口点运行脚本和在脚本里面运行命令的区别吗?

我不推荐你使用ConfigMap,而是build议你将脚本构造成一个初始化容器,这个初始化容器与在同一个Pod中托pipeMongoDB的容器并行运行。

初始化容器出现在Kubernetes 1.6中,所以你至less需要运行这个版本来利用这个版本 – 但是对于当前的minikube实例,这不应该是个问题。 如果您只是将备份加载到位,这可能就足够了,但是Janos在注释中指出 – 这些容器都容器“准备就绪” 之前运行并且在容器上定义的任何常规容器之前依次运行。 这些吊舱也必须在主容器得到控制之前退出。

您也可能能够利用容器生命周期钩子,这些钩子在容器启动之前不能保证任何顺序,但可以在Pod开始和被标记为“准备好”之间做一些工作(并因此被添加到服务等等)

init容器有4个文档点,可以让你很好地理解这是什么以及如何去做:

  • Init容器概述
  • 使用NGINX&wget的init容器示例
  • 关于debuggingInit容器的注意事项
  • 容器生命周期钩子

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

在一般情况下,我build议build立一个专门的容器,它有你想要的工具来完成这个数据加载 – 一个带有bzip2curl和mongodb客户端的小容器,并且使该容器的ENTRYPOINT / CMD成为核心您目前在ConfigMap中设置的脚本。 但是,因为init容器会 mongod运行之前运行,所以这不会对你有所帮助。

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