【问题标题】:Unable to run apt-get in docker mongo initdb script无法在 docker mongo initdb 脚本中运行 apt-get
【发布时间】:2018-04-04 09:52:38
【问题描述】:

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

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 使用来自该网址的正确数据运行,我是 curling。但是,当我使用 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-gets 之前添加sudo,我只会得到sudo: command not found 错误。

我怎样才能用我的数据库正确启动 mongo?除了使用curl,我对其他解决方案持开放态度。

注意:

如果我运行 kubectl exec -it mongo-xxxxx bash 然后在 pod 中输入这些命令,这些命令就会起作用!有人可以解释在入口点运行脚本和在 pod 内运行命令之间的区别吗?

【问题讨论】:

    标签: mongodb docker kubernetes kubectl minikube


    【解决方案1】:

    与其使用 ConfigMap,我建议您将脚本构造为从初始化容器中调用的东西,该容器与在同一个 Pod 中托管 MongoDB 的容器并行运行。

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

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

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

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

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

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

    【讨论】:

    • 请注意,Init Containers 不会与您的普通容器并行运行,但它们会在之前运行它们。 (顺序,如果您有多个 Init 容器)。因此,初始化容器中的 mongo 客户端将无济于事,因为服务器尚未运行。
    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 2016-11-25
    • 2021-09-30
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多