I want to set initial data on MySQL of container. In docker-compose.yml, such code can create initial data when running container.
volumes:   - db:/var/lib/mysql   - "./docker/mysql/conf.d:/etc/mysql/conf.d"   - "./docker/mysql/init.d:/docker-entrypoint-initdb.d"   However, how can I create initial data on Kubernetes when running?
Kubernetes provides excellent support for stateful applications, such as MySQL, through the use of persistent volumes. These persistent volumes are used to create permanent Kubernetes storage for pods and containers.
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: v1 kind: Pod metadata:   name: mysql spec:   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: v1 kind: ConfigMap metadata:   name: mysql-initdb-config data:   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'); 
                        kind: PersistentVolume apiVersion: v1 metadata:   name: mysql-initdb-pv-volume   labels:     type: local     app: mysql spec:   storageClassName: manual   capacity:     storage: 1Mi   accessModes:     - ReadOnlyMany   hostPath:     path: "/path/to/initdb/sql/scripts" --- kind: PersistentVolumeClaim apiVersion: v1 metadata:   name: mysql-initdb-pv-claim   labels:     app: mysql spec:   storageClassName: manual   accessModes:     - ReadOnlyMany   resources:     requests:       storage: 1Mi   Note: assume that you have your SQL scripts in /path/to/initdb/sql/scripts
/docker-entrypoint-initdb.d apiVersion: extensions/v1beta1 kind: Deployment metadata:   name: mysql spec:   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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With