mysql.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package docker_base
  2. import (
  3. "context"
  4. "github.com/docker/docker/api/types"
  5. "github.com/docker/docker/api/types/container"
  6. "github.com/docker/docker/api/types/filters"
  7. "github.com/docker/docker/api/types/network"
  8. client2 "github.com/docker/docker/client"
  9. "time"
  10. )
  11. //创建一个mysql数据库
  12. func MysqlCreate(mysqlConfig MysqlConfig, dbId string, cpuShares int64, memory int64) (string, error) {
  13. const imageName = "mysql"
  14. const imageVersion = "8"
  15. const imageNet = "oasis"
  16. cli, err := client2.NewClientWithOpts(client2.FromEnv)
  17. if err != nil {
  18. return "", err
  19. }
  20. defer cli.Close()
  21. _, err = cli.ImagePull(context.Background(), imageName+":"+imageVersion, types.ImagePullOptions{})
  22. isExist := true
  23. //检查到镜像才继续
  24. for isExist {
  25. filter := filters.NewArgs()
  26. filter.Add("before", imageName+":"+imageVersion)
  27. list, e := cli.ImageList(context.Background(), types.ImageListOptions{Filters: filter})
  28. if e == nil && len(list) > 0 {
  29. isExist = false
  30. }
  31. time.Sleep(time.Second)
  32. }
  33. var envArr = []string{"MYSQL_ROOT_PASSWORD=" + mysqlConfig.DataBasePassword, "MYSQL_DATABASE=" + mysqlConfig.DataBaseDB}
  34. res := container.Resources{}
  35. if cpuShares > 0 {
  36. res.CPUShares = cpuShares
  37. }
  38. if memory > 0 {
  39. res.Memory = memory << 20
  40. }
  41. rp := container.RestartPolicy{}
  42. rp.Name = "always"
  43. config := &container.Config{
  44. Image: imageName,
  45. Labels: map[string]string{"version": imageVersion, "author": "official"},
  46. Env: envArr,
  47. }
  48. hostConfig := &container.HostConfig{Resources: res, RestartPolicy: rp, NetworkMode: container.NetworkMode(imageNet)}
  49. containerCreate, err := cli.ContainerCreate(context.Background(),
  50. config,
  51. hostConfig,
  52. &network.NetworkingConfig{EndpointsConfig: map[string]*network.EndpointSettings{imageNet: {NetworkID: ""}}},
  53. nil,
  54. dbId)
  55. containerId := containerCreate.ID
  56. //启动容器
  57. err = cli.ContainerStart(context.Background(), dbId, types.ContainerStartOptions{})
  58. if err != nil {
  59. return containerId, err
  60. }
  61. return containerId, nil
  62. }
  63. func MysqlDelete(dbId string) error {
  64. cli, err := client2.NewClientWithOpts(client2.FromEnv)
  65. if err != nil {
  66. return err
  67. }
  68. defer cli.Close()
  69. err = cli.ContainerStop(context.Background(), dbId, nil)
  70. if err != nil {
  71. return err
  72. }
  73. err = cli.ContainerRemove(context.Background(), dbId, types.ContainerRemoveOptions{})
  74. return err
  75. }