Docker容器内的Docker Golang客户端

时间:2018-11-28 21:30:16

标签: docker go google-container-registry docker-in-docker

我正在尝试使用docker go client连接到Google容器注册表以列出和删除图像。我的golang应用程序也存在于docker容器中。

这是我的golang应用程序的dockerfile:

FROM docker:latest

USER root

RUN apk add --update openssl

ADD ./data /app/data
ADD ./data/docker /app/data/docker
ADD mygolangapp /app

RUN chmod -R a+rwx ./app/data/docker/generate_docker_cert.sh
RUN sh ./app/data/docker/generate_docker_cert.sh

ENV GOOGLE_APPLICATION_CREDENTIALS ./app/data/myserviceaccount.json
ENV DOCKER_CONFIG ./app/data/docker
ENV DOCKER_CERT_PATH .
ENV DOCKER_HOST ????????

ENTRYPOINT ["/app/mygolangapp"]

这是generate_docker_cert.sh文件 (https://gist.github.com/bradrydzewski/a6090115b3fecfc25280

这是我用来创建docker go客户端和列表容器的golang代码。

jsonBytes, err := ioutil.ReadFile(os.Getenv("GOOGLE_APPLICATION_CREDENTIALS"))
if err != nil {
    panic(err)
}

dockercli, err := client.NewEnvClient()
if err != nil {
    panic(err)
}

dockercli.RegistryLogin(context.Background(), types.AuthConfig{
    Username:      "_json_key",
    Password:      string(jsonBytes),
    ServerAddress: "https://eu.gcr.io",
})

containers, err := dockercli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
    panic(err)
}

for _, container := range containers {
    fmt.Printf("%s %s\n", container.ID[:10], container.Image)
}

当前我收到此错误:

error during connect: Get https://%2Fvar%2Frun%2Fdocker.sock/v1.25/containers/json?limit=0: dial tcp: lookup /var/run/docker.sock: no such host

所以我在docker-compose中添加了docker.sock作为卷,但是它不起作用?

mygolangapp:
  build: ./mygolangapp
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock

我的问题是:如何在用于Google容器注册表的golang应用程序中使用docker golang客户端。我在这里做错了什么或想念什么? DOCKER_HOST应该是什么?

感谢您的帮助。任何其他方法都非常受欢迎!

1 个答案:

答案 0 :(得分:0)

作为一种可能的替代方法,您可以浏览google / go-containerregistry库:https://github.com/google/go-containerregistry

您似乎正在尝试实现某种垃圾收集工具。如果是这样,您还可以在这里查看如何使用该库的示例:https://github.com/google/go-containerregistry/pull/300