2017-10-21 86 views
1

我想让我的应用程序在minikube上运行,在minikube ip地址可以访问。以下是我用来运行它的命令。这一切都按我的意愿工作(如果我尝试登录,它会返回预期的401,因为mongo DB是空的)。如何在kubernetes中包含mongo映像的数据

我想实际上在我的应用程序中包含一个数据库,例如现有的用户。我无法找到一个清楚的方式来说明如何在我正在做的事情中包含数据(比如在一个与mongo一起使用的tar文件中)。我怎样才能做到这一点?

### Get mongo up 
docker pull mongo:3.2 
kubectl run mongo --image=mongo:3.2 --port=27017 
kubectl expose deployment mongo 

### Get API up 
cd /api 
docker build -t api:v1 . 
kubectl run api --image=api:v1 --port=3000 --env="MONGODB_URI=mongodb://mongo:27017/myapp-dev" 
kubectl apply -f api-deployment.yml 
kubectl expose deployment api --type=LoadBalancer 

### Get dashboard up 
docker build -t myapp-dashboard:v1 . 
kubectl apply -f ./tooling/minikube/myapp-dashboard-qa-config-map.yml 
kubectl apply -f ./tooling/minikube/myapp-dashboard-deployment.yml 
kubectl expose deployment myapp-dashboard --type=LoadBalancer 

### Ingress setup 
minikube addons enable ingress 
kubectl create -f ingress.yml 
kubectl apply -f ./tooling/minikube/ingress.yml 

回答

1

做它利用在mongo图像0​​基础设施的很好的方式。 mongo:3.2包括一个entrypoint shell script,它反复遍历/docker-entrypoint-initdb.d/*.{sh,js}(在容器中)。

根据需要插入到新建数据库的数据类型,使用ConfigMapSecret作为卷是一种方法。但你不能这样做,kubectl run

1.创建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 

2.创建createuser.sh这样的(只是一个example):

mongo <<EOF 
use reporting 
db.createUser(
    { 
    user: "reportsUser", 
    pwd: "12345678", 
    roles: [ 
     { role: "read", db: "reporting" }, 
     { role: "read", db: "products" }, 
     { role: "read", db: "sales" }, 
     { role: "readWrite", db: "accounts" } 
    ] 
    } 
) 
EOF 

3.创建ConfigMap

$ kubectl create configmap mongo-initdb --from-file=createuser.sh 
configmap "mongo-initdb" created 

4.创建蒙戈部署(而不是kubectl run mongo --image=mongo:3.2 --port=27017):

$ kubectl apply -f mongo.yaml 
deployment "mongo" created 

5.检查日志:

$ kubectl logs -f deploy/mongo 
[...] 
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/createuser.sh 
MongoDB shell version: 3.2.17 
[...] 
Successfully added user: { 
[...] 

正如我提到的一个非常类似的解决方案可以敏感数据使用Secrets完成。 kubectl create configmap --from-file=...命令也接受目录的名称而不是文件,并且按预期工作。

+0

嗨,谢谢你的回答!我用它来处理你的例子,但我现在试图导入一个数据库,并面临一些问题。在'createuser.sh'脚本里面,我试图卷曲'myapp-db.tar.bz2',所以我可以'mongorestore'它,但是我的荚断了,日志说'curl:command not found'。我尝试添加'apt-get'脚本,但日志中显示'无法打开锁定文件/ var/lib/dpkg/lock - open(13:Permission denied)'。我怎样才能在这里正确运行脚本?我将在下面发布我的完整shell文件: – swagrov

+0

'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 mapp-db.tar.bz2 | tar xvf - mongorestore --db myapp-dev myapp-dev mongo myapp-dev --eval'db.users。更新({},{$ set:{hashedPassword:“fwaPwkoIpS4y4aWA + uljXWIlyjTxUzkU + IgK4 + B8m + ZhyBrWwM/N/oGfUj0ERAcwnXCOImkOvbvDMH/BAmN8FA ==”,salt:“YfnL4jUxfbYY6Y3/w8P8KA ==”}},{multi:true}) ' mongo myapp-dev --eval'db.getCollection(“users”)。dropIndex(“referral_1”)' – swagrov

+0

initdb脚本没有以root身份运行,这就是为什么你不能执行apt-get update /从那里安装'。在'name'下的'containers:'部分只需添加'command:[“sh”,“ - c”,“apt-get update && apt-get install ... && exec docker-entrypoint.sh”]' 。这应该尽快解决问题。更好的是,建立你自己的mongo图像,它有curl :-) –

相关问题