How to initialize mysql container when created on Kubernetes? How to initialize mysql container when created on Kubernetes? kubernetes kubernetes

How to initialize mysql container when created on Kubernetes?


According to the MySQL Docker image README, the part that is relevant to data initialization on container start-up is to ensure all your initialization files are mount to the container's /docker-entrypoint-initdb.d folder.

You can define your initial data in a ConfigMap, and mount the corresponding volume in your pod like this:

apiVersion: v1kind: Podmetadata:  name: mysqlspec:  containers:  - name: mysql    image: mysql            ports:      - containerPort: 3306    volumeMounts:      - name: mysql-initdb        mountPath: /docker-entrypoint-initdb.d  volumes:    - name: mysql-initdb      configMap:        name: mysql-initdb-config---apiVersion: v1kind: ConfigMapmetadata:  name: mysql-initdb-configdata:  initdb.sql: |    CREATE TABLE friends (id INT, name VARCHAR(256), age INT, gender VARCHAR(3));    INSERT INTO friends VALUES (1, 'John Smith', 32, 'm');    INSERT INTO friends VALUES (2, 'Lilian Worksmith', 29, 'f');    INSERT INTO friends VALUES (3, 'Michael Rupert', 27, 'm');


First: create persistent volume that contains your SQL scripts

kind: PersistentVolumeapiVersion: v1metadata:  name: mysql-initdb-pv-volume  labels:    type: local    app: mysqlspec:  storageClassName: manual  capacity:    storage: 1Mi  accessModes:    - ReadOnlyMany  hostPath:    path: "/path/to/initdb/sql/scripts"---kind: PersistentVolumeClaimapiVersion: v1metadata:  name: mysql-initdb-pv-claim  labels:    app: mysqlspec:  storageClassName: manual  accessModes:    - ReadOnlyMany  resources:    requests:      storage: 1Mi

Note: assume that you have your SQL scripts in /path/to/initdb/sql/scripts

Second: mount the volume to /docker-entrypoint-initdb.d

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: mysqlspec:  replicas: 1  template:    metadata:      labels:        app: mysql    spec:      containers:        - name: mysql          image: mysql          imagePullPolicy: "IfNotPresent"          ports:            - containerPort: 3306          volumeMounts:            - mountPath: /docker-entrypoint-initdb.d              name: mysql-initdb      volumes:        - name: mysql-initdb          persistentVolumeClaim:            claimName: mysql-initdb-pv-claim

That's it.

Note: this applies to PostgreSQL too.


you need to create pv and pvclaim like this then deploy the mysql database

kind: PersistentVolumeapiVersion: v1metadata:  name: sfg-dev-mysql-pv-volume  labels:    type: localspec:  storageClassName: manual  capacity:    storage: 1Gi  accessModes:    - ReadWriteOnce  hostPath:    path: "/tmp/data"---kind: PersistentVolumeClaimapiVersion: v1metadata:  name: sfg-dev-mysql-pv-claimspec:  storageClassName: manual  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 1Gi

create secret:

kubectl create secret generic mysql-secret --from-literal=mysql-root-password=kube1234 --from-literal=mysql-user=testadm --from-literal=mysql-password=kube1234kubectl create configmap db --from-literal=mysql-database: database

mysql deployment:

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: sfg-dev-mysql-db  labels:    app: sfg-dev-mysqlspec:  strategy:    type: Recreate  template:    metadata:      labels:        app: sfg-dev-mysql        tier: db    spec:      containers:      - image: mysql:8.0.2        name: mysql        env:        - name: MYSQL_DATABASE          valueFrom:            configMapKeyRef:              name: db              key: mysql-database                - name: MYSQL_ROOT_PASSWORD          valueFrom:            secretKeyRef:              name: mysql-secret              key: mysql-root-password        - name: MYSQL_USER          valueFrom:            secretKeyRef:              name: mysql-secret              key: mysql-user        - name: MYSQL_PASSWORD          valueFrom:            secretKeyRef:              name: mysql-secret              key: mysql-password        ports:        - containerPort: 3306          name: mysql        volumeMounts:        - name: mysql-persistent-storage          mountPath: /var/lib/mysql      volumes:      - name: mysql-persistent-storage        persistentVolumeClaim:          claimName: sfg-dev-mysql-pv-claim