1. package main
    2. import (
    3. "context"
    4. "fmt"
    5. "github.com/docker/docker/api/types"
    6. "github.com/docker/docker/api/types/container"
    7. "github.com/docker/docker/client"
    8. "github.com/docker/go-connections/nat"
    9. "time"
    10. )
    11. func main() {
    12. cli, err := client.NewClientWithOpts()
    13. if err != nil {
    14. panic(err)
    15. }
    16. ctx := context.Background()
    17. resp, err := cli.ContainerCreate(
    18. ctx,
    19. &container.Config{
    20. Image: "mongo:latest", // 1 没有的镜像不会自动拉取
    21. ExposedPorts: nat.PortSet{
    22. "27017/tcp": {},
    23. },
    24. },
    25. &container.HostConfig{
    26. PortBindings: nat.PortMap{
    27. "27017/tcp": []nat.PortBinding{
    28. {
    29. HostIP: "127.0.0.1",
    30. HostPort: "0", // 2 会自动找一个本机没有占用的端口做映射
    31. },
    32. },
    33. },
    34. },
    35. nil,
    36. nil,
    37. "Test",
    38. )
    39. if err != nil {
    40. panic(err)
    41. }
    42. err = cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
    43. if err != nil {
    44. panic(err)
    45. }
    46. fmt.Println("container started")
    47. time.Sleep(10 * time.Second)
    48. inspRes, err := cli.ContainerInspect(ctx, resp.ID)
    49. if err != nil {
    50. panic(err)
    51. }
    52. fmt.Printf("listening at %+v\n", inspRes.NetworkSettings)
    53. fmt.Println("killing container")
    54. err = cli.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{
    55. Force: true,
    56. })
    57. if err != nil {
    58. panic(err)
    59. }
    60. }

    go 有这种能力惊艳到了我,可以写出各种强大的功能,比如,写测试用例时起一个新的数据库容器,测试完成自动清理调,完全自动化了。

    屏幕录制2021-06-12 下午8.23.12.mov (5.76MB)