首页 > 解决方案 > 为什么容器已经存在?

问题描述

我正在尝试通过https://pkg.go.dev/github.com/fsouza/go-dockerclient?tab=doc创建一个容器,如下所示:

path, err := os.Getwd()
NoError(t, err, err)

source := fmt.Sprintf("%s/gogs/data-backup", path)
dest := fmt.Sprintf("%s/gogs/data", path)

defer os.RemoveAll(dest)

err = copy.Copy(source, dest)
NoError(t, err, err)

client, err := docker.NewClientFromEnv()
NoError(t, err, err)

ctx := context.Background()


gogs, err := client.CreateContainer(docker.CreateContainerOptions{
    Name: "gogs",
    Config: &docker.Config{
        Image: "gogs/gogs:0.11.91",
        ExposedPorts: map[docker.Port]struct{}{
            "3000/tcp": {}},
    },
    HostConfig: &docker.HostConfig{
        PublishAllPorts: true,
        AutoRemove:      true,
        Binds:           []string{dest, "/data"},
        PortBindings: map[docker.Port][]docker.PortBinding{
            "3000/tcp": {{HostIP: "0.0.0.0", HostPort: "8888"}}},
    },
    Context: ctx,
})

NoError(t, err, err)
defer client.StopContainer(gogs.ID, 5)

当我跑步时,它抱怨:

=== RUN   TestGitAutoTag
    TestGitAutoTag: auto_tagger_test.go:55: 
            Error Trace:    auto_tagger_test.go:55
            Error:          Received unexpected error:
                            container already exists
            Test:           TestGitAutoTag
            Messages:       container already exists
--- FAIL: TestGitAutoTag (0.02s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x9e1d06]

当我查看主机上正在运行的容器时:

docker ps
CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS              PORTS                           NAMES
c2c9155514ee        drone/drone-runner-docker:1.2.1   "/bin/drone-runner-d…"   11 hours ago        Up 5 hours          0.0.0.0:3000->3000/tcp          drone-runner
6a7f43e6d541        drone/drone:1.6.5                 "/bin/drone-server"      11 hours ago        Up 5 hours          443/tcp, 0.0.0.0:8080->80/tcp   drone

我看不到任何带有名称的容器gogs。我想要实现的是:

docker run --rm -it -p 8888:3000 --name=gogs --mount type=bind,source=`pwd`/gogs/data,target=/data gogs/gogs  

我究竟做错了什么?

标签: dockergo

解决方案


推荐阅读