Как запустить docker контейнер внутри установки? - PullRequest
0 голосов
/ 23 апреля 2020

Я создал конвейер 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"  

Что я делаю не так?

1 Ответ

0 голосов
/ 01 мая 2020

Взгляните на Drone services. Это позволяет вам вызвать контейнер как часть вашего конвейера и получить доступ к его портам.

В вашем случае вы можете вызвать контейнер Gogs. как это:

services:
- name: gogs
  image: gogs/gogs

А затем используйте это в следующих шагах конвейера:

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

(предполагается, что контейнер gogs прослушивает порт 80. Если это другой порт тогда вам нужно настроить URI).

Подсказка: имя службы - это DNS-имя контейнера.

...