【问题标题】:How to start a docker container inside the setup?如何在设置中启动 docker 容器?
【发布时间】:2020-04-23 18:10:14
【问题描述】:

我创建了一个 DroneCI 管道,内容如下:

kind: pipeline
type: docker
name: Build auto git tagger

steps:
  - name: test and build
    image: golang
    commands:
      - go mod download
      - go test ./test
      - go build -o ./build/package ./cmd/git-tagger

  - name: Build docker image
    image: plugins/docker
    pull: if-not-exists
    settings:
      username: 
      password: 
      repo: 
      dockerfile: 
      registry: 
      auto_tag: 

trigger:
  branch:
    - master

go test 启动一个 gogs docker 容器用于测试目的,代码如下:

func createGogsContainer(dest, waitUrl string) (stopContainer, error) {
    client, err := docker.NewClientFromEnv()
    if err != nil {
        return nil, err
    }

    ctx := context.Background()

    gogs, err := client.CreateContainer(docker.CreateContainerOptions{
        Name: "repo",
        Config: &docker.Config{
            Image: "gogs/gogs",
        },
        HostConfig: &docker.HostConfig{
            PublishAllPorts: true,
            AutoRemove:      true,
            Mounts: []docker.HostMount{
                {
                    Type:   "bind",
                    Source: dest,
                    Target: "/data",
                }},
            PortBindings: map[docker.Port][]docker.PortBinding{
                "3000/tcp": {{HostIP: "0.0.0.0", HostPort: "8888"}},
                "22/tcp":   {{HostIP: "0.0.0.0", HostPort: "2222"}},
            },
        },
        Context: ctx,
    })
    if err != nil {
        return nil, err
    }

    err = client.StartContainer(gogs.ID, nil)
    if err != nil {
        return nil, err
    }

    //Wait for connection
    host, err := url.Parse(waitUrl)
    if err != nil {
        return nil, err
    }

    err = waitHTTP(fmt.Sprintf("%s://%s", host.Scheme, host.Host), 3, 0)
    if err != nil {
        return nil, err
    }

    return func() error {
        return client.StopContainerWithContext(gogs.ID, 5, ctx)
    }, nil
}  

管道已中止并显示以下错误消息:

latest: Pulling from library/golang
Digest: sha256:f30b0d05ea7783131d84deea3b5f4d418d9d930dfa3668a9a5fa253d1f9dce5a
Status: Image is up to date for golang:latest
+ go mod download
+ go test ./test
time="2020-04-23T17:58:24Z" level=error msg="Get \"http://0.0.0.0:8888/gat/WithoutTag.git/info/refs?service=git-upload-pack\": dial tcp 0.0.0.0:8888: connect: connection refused"
time="2020-04-23T17:58:24Z" level=error msg="Get \"http://0.0.0.0:8888/gat/WithoutTag.git/info/refs?service=git-upload-pack\": dial tcp 0.0.0.0:8888: connect: connection refused"  

我做错了什么?

【问题讨论】:

  • 0.0.0.0 是一个特殊的 IPv4 地址,意思是“无处不在”;将其包含在 URL 中通常没有意义。我不知道net/http 是如何对待它的。您也可能等待容器准备就绪的时间不够长。
  • @DavidMaze 你建议我应该怎么做?
  • 如果这个测试驱动程序本身没有在容器中运行,并且 Docker 没有在 VM 中运行,您可以使用 127.0.0.1localhost 作为 URL 的主机部分。目前尚不清楚waitHTTP 的参数是什么,但您可能还需要更多的重试或更长的重试延迟。

标签: docker go continuous-integration drone.io


【解决方案1】:

看看Drone services. 它允许您将容器作为管道的一部分并访问其端口。

在您的情况下,您可以像这样调出 Gogs 容器:

services:
- name: gogs
  image: gogs/gogs

然后在您的管道步骤中像这样使用它:

steps:
  - name: test and build
    image: golang
    commands:
      - curl "http://gogs"
      -
...

(假设gogs 容器在端口 80 上进行侦听。如果是不同的端口,则需要调整 URI)。

提示:服务的名称是容器的 DNS 名称。

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 2018-05-22
    • 2016-12-17
    • 2019-03-13
    • 2016-12-16
    • 2014-12-28
    • 2021-05-16
    • 2021-04-07
    相关资源
    最近更新 更多