如何在Kubernetes上创建时初始化mysql容器?

Har*_*rry 5 mysql docker kubernetes

我想在容器的MySQL上设置初始数据.在docker-compose.yml中,此类代码可以在运行容器时创建初始数据.

volumes:
  - db:/var/lib/mysql
  - "./docker/mysql/conf.d:/etc/mysql/conf.d"
  - "./docker/mysql/init.d:/docker-entrypoint-initdb.d"
Run Code Online (Sandbox Code Playgroud)

但是,如何在运行时在Kubernetes上创建初始数据?

iva*_*sim 10

根据MySQL Docker镜像README,与容器启动时数据初始化相关的部分是确保所有初始化文件都安装到容器的/docker-entrypoint-initdb.d文件夹中.

您可以在a中定义初始数据ConfigMap,并在pod中安装相应的卷,如下所示:

apiVersion: extensions/v1beta1
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');
Run Code Online (Sandbox Code Playgroud)


Yuc*_*uci 9

首先:创建包含 SQL 脚本的持久卷

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
Run Code Online (Sandbox Code Playgroud)

注意:假设您的 SQL 脚本位于/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
Run Code Online (Sandbox Code Playgroud)

就是这样。

注意:这也适用于 PostgreSQL。