最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

kubernetes - Seed MongoDB in local minikube cluster using skaffold - Stack Overflow

programmeradmin12浏览0评论

I am using a skaffold to deploy mongodb to my local minikube cluster.

sample files below:

skaffold.yaml

apiVersion: skaffold/v2beta26
kind: Config

metadata:
  name: mongodb

deploy:
  kubectl:
    manifests:
    - "config/namespace.yaml"
    - "config/mongodb.yaml"
    defaultNamespace: "mongodb"

config/namespace.yaml

kind: Namespace
apiVersion: v1
metadata:
  name: mongodb
  labels:
    name: mongodb

config/mongodb.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-mongo-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb-mongo
  template:
    metadata:
      labels:
        app: mongodb-mongo
    spec:
      containers:
        - name: mongodb-mongo
          image: mongo
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-mongo-srv
spec:
  selector:
    app: mongodb-mongo
  ports:
    - name: db
      protocol: TCP
      port: 27017
      targetPort: 27017

It successfully creates a mongodb instance in my minikube cluster.

I would also like to seed the db with some json data.

Is there are way to do this using skaffold ?


Update:

I have also created a configmap and a job to seed the database so my config is as follows:

skaffold.yaml

apiVersion: skaffold/v2beta26
kind: Config

metadata:
  name: mongodb

deploy:
  kubectl:
    manifests:
    - "config/namespace.yaml"
    - "config/configmap.yaml"
    - "config/mongodb.yaml"
    - "config/mongo-seed-job.yaml"
    defaultNamespace: "mongodb"

congigmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: seed-data
  namespace: mongodb
data:
  init.json: |
    [{"name":"Joe Smith","email":"[email protected]","age":40,"admin":false},{"name":"Jen Ford","email":"[email protected]","age":45,"admin":true}]

mongo-seed-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: mongo-seed
spec:
  template:
    spec:
      containers:
      - name: seed
        image: mongo:latest
        command: ["sh", "-c", "mongoimport --uri mongodb://mongodb:27017/mydb --collection accounts --type json --file '/init.json' --jsonArray"]
        volumeMounts: 
        - name: seed-data
          mountPath: /data
      volumes:
      - name: seed-data
        configMap:
          name: seed-data
          items:
          - key: init.json
            path: init.json
      restartPolicy: Never

now the mongo-seed pod wont start. I am getting ContainerCannotRun

I am using a skaffold to deploy mongodb to my local minikube cluster.

sample files below:

skaffold.yaml

apiVersion: skaffold/v2beta26
kind: Config

metadata:
  name: mongodb

deploy:
  kubectl:
    manifests:
    - "config/namespace.yaml"
    - "config/mongodb.yaml"
    defaultNamespace: "mongodb"

config/namespace.yaml

kind: Namespace
apiVersion: v1
metadata:
  name: mongodb
  labels:
    name: mongodb

config/mongodb.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-mongo-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb-mongo
  template:
    metadata:
      labels:
        app: mongodb-mongo
    spec:
      containers:
        - name: mongodb-mongo
          image: mongo
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-mongo-srv
spec:
  selector:
    app: mongodb-mongo
  ports:
    - name: db
      protocol: TCP
      port: 27017
      targetPort: 27017

It successfully creates a mongodb instance in my minikube cluster.

I would also like to seed the db with some json data.

Is there are way to do this using skaffold ?


Update:

I have also created a configmap and a job to seed the database so my config is as follows:

skaffold.yaml

apiVersion: skaffold/v2beta26
kind: Config

metadata:
  name: mongodb

deploy:
  kubectl:
    manifests:
    - "config/namespace.yaml"
    - "config/configmap.yaml"
    - "config/mongodb.yaml"
    - "config/mongo-seed-job.yaml"
    defaultNamespace: "mongodb"

congigmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: seed-data
  namespace: mongodb
data:
  init.json: |
    [{"name":"Joe Smith","email":"[email protected]","age":40,"admin":false},{"name":"Jen Ford","email":"[email protected]","age":45,"admin":true}]

mongo-seed-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: mongo-seed
spec:
  template:
    spec:
      containers:
      - name: seed
        image: mongo:latest
        command: ["sh", "-c", "mongoimport --uri mongodb://mongodb:27017/mydb --collection accounts --type json --file '/init.json' --jsonArray"]
        volumeMounts: 
        - name: seed-data
          mountPath: /data
      volumes:
      - name: seed-data
        configMap:
          name: seed-data
          items:
          - key: init.json
            path: init.json
      restartPolicy: Never

now the mongo-seed pod wont start. I am getting ContainerCannotRun

Share Improve this question edited Feb 5 at 18:21 mh377 asked Feb 5 at 9:51 mh377mh377 1,8365 gold badges27 silver badges50 bronze badges 10
  • Yes you can seed the MongoDB database with JSON data using scaffold and first you need to store your JSON data in a kubernetes configMap. And if you want to seed the db with some json data you can try to use --jsonArray option: mongoimport -d mydb -c mycollection –jsonArray <glossary.json Additionally, refer to this and let me know if it was helpful for resolving your issue. – Imran Premnawaz Commented Feb 5 at 12:58
  • thanks for the help. I now get the following 2025-02-05T13:09:42.181+0000 Failed: open /init.json: no such file or directory │ │ 2025-02-05T13:09:42.181+0000 0 document(s) imported successfully. 0 document(s) failed to import. . This it my command command: ["sh", "-c", "mongoimport --uri mongodb://mongodb:27017/mydb --collection accounts --type json --file '/init.json' --jsonArray"] – mh377 Commented Feb 5 at 13:20
  • The error you are encountering is because the file path provided in the mongoimport command does not match the location where the file is actually mounted inside the container. Try Using double quotes " in the directory as mentioned below: mongoimport --db submissions --collection tracks --file "C:\\Users<username\>\\Documents\\data.json" – Imran Premnawaz Commented Feb 5 at 13:40
  • Isnt that the path to where the file is located in your local machine ? rather than the docker container ? – mh377 Commented Feb 5 at 13:49
  • The path in your mongoimport command should indeed refer to the file location inside the docker container not your local machine. When you are mounting a file into a kubernetes container using configMap, the file path within the container is where you should reference it. Hope this helps now. – Imran Premnawaz Commented Feb 5 at 13:54
 |  Show 5 more comments

1 Answer 1

Reset to default 0

I managed to get it working. Here is the working code if anyone else needs it:

skaffold.yaml

apiVersion: skaffold/v2beta26
kind: Config

metadata:
  name: mongodb

deploy:
  kubectl:
    manifests:
    - "config/namespace.yaml"
    - "config/mongodb-credentials.yaml"
    - "config/configmap.yaml"
    - "config/mongodb.yaml"
    - "config/mongo-seed-job.yaml"
    defaultNamespace: "mongodb"

config/namespace.yaml

kind: Namespace
apiVersion: v1
metadata:
  name: mongodb
  labels:
    name: mongodb

config/mongodb-credentials.yaml

Note: username: admin password: password

Please change this to whatever you want

apiVersion: v1
kind: Secret
metadata:
  name: mongodb-credentials
type: Opaque
data:
  username: YWRtaW4=
  password: cGFzc3dvcmQ=

config/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: seed-data
data:
  init.json: |
    [{"name":"Joe Smith","email":"[email protected]","age":40,"admin":false},{"name":"Jen Ford","email":"[email protected]","age":45,"admin":true}]

config/mongodb.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongodb
          image: mongo:latest
          ports:
          - containerPort: 27017
          volumeMounts:
          - name: mongo-data
            mountPath: /data/db
          env:
            - name: MONGO_INITDB_ROOT_USERNAME
              valueFrom:
                secretKeyRef:
                  name: mongodb-credentials
                  key: username
            - name: MONGO_INITDB_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mongodb-credentials
                  key: password
      volumes:
      - name: mongo-data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  ports:
    - port: 27017
  selector:
    app: mongodb

config/mongo-seed-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: mongo-seed
spec:
  template:
    spec:
      initContainers:
      - name: init-copy
        image: busybox
        command: ['sh', '-c', 'cp /config/init.json /data/']
        volumeMounts:
        - name: config-volume
          mountPath: /config
        - name: data-volume
          mountPath: /data
      containers:
      - name: seed
        image: mongo:latest
        command: ["sh", "-c", "mongoimport --uri mongodb://$(MONGO_USERNAME):$(MONGO_PASSWORD)@mongodb:27017/mydb --collection accounts --type json --file /data/init.json --jsonArray --authenticationDatabase=admin"]
        env:
          - name: MONGO_USERNAME
            valueFrom:
              secretKeyRef:
                name: mongodb-credentials
                key: username
          - name: MONGO_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mongodb-credentials
                key: password
        volumeMounts: 
        - name: data-volume
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: config-volume
        configMap:
          name: seed-data
      - name: data-volume
        emptyDir: {}

If anyone has any alternate solutions it would be good to know.

Thanks @imran-premnawaz for your help

发布评论

评论列表(0)

  1. 暂无评论