check context builder endpoint by crazy-max · Pull Request #1129 · docker/buildx (original) (raw)

while making some tests with @tonistiigi about an issue with rm --all-inactive that doesn't effectively remove some inactive nodes we saw that there is an underlying issue with docker context being detected as a docker-container builder:

$ docker context create --docker host=ssh://mini remote-buildkit
remote-buildkit

$ docker context ls
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT                               KUBERNETES ENDPOINT   ORCHESTRATOR
default *           moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                                         swarm
desktop-linux       moby                                                          npipe:////./pipe/dockerDesktopLinuxEngine
desktop-windows     moby                                                          npipe:////./pipe/dockerDesktopWindowsEngine
remote-buildkit     moby                                                          ssh://mini

$ docker buildx ls
NAME/NODE         DRIVER/ENDPOINT                        STATUS                 BUILDKIT PLATFORMS
builder           docker-container
  builder0        unix:///var/run/docker.sock            running                394ccf8  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
  mac-mini-m1     tcp://mac-mini-m1.home.foobar.com:2376 running                394ccf8  linux/arm64*, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
  sifive          tcp://sifive.home.foobar.com:2375      running                394ccf8  linux/riscv64*
builder2 *        docker-container
  builder20       unix:///var/run/docker.sock            running                394ccf8  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
fervent_raman     docker-container
  fervent_raman0  unix:///var/run/docker.sock            running                v0.10.3  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux                                            protocol not available
desktop-windows                                          protocol not available
remote-buildkit   docker-container
  remote-buildkit remote-buildkit                        error during connect: Get "http://docker.example.com/v1.24/info": command [ssh -- mini docker system dial-stdio] has exited with exit status 255, please make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=ssh: Could not resolve hostname mini: Name or service not known
default   docker
  default default running 20.10.14 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

here remote-buildkit should not be a docker-container builder. that's because we don't check this endpoint while initializing the docker client so it assumes the underlying node is a docker-container when returned from:

this PR adds a basic Ping check when docker client is initialized so we can find out early that this builder is faulty:

$ docker buildx ls
NAME/NODE        DRIVER/ENDPOINT                        STATUS                 BUILDKIT PLATFORMS
builder          docker-container
  builder0       unix:///var/run/docker.sock            running                394ccf8  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
  mac-mini-m1    tcp://mac-mini-m1.home.foobar.com:2376 running                394ccf8  linux/arm64*, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
  sifive         tcp://sifive.home.foobar.com:2375      running                394ccf8  linux/riscv64*
builder2 *       docker-container
  builder20      unix:///var/run/docker.sock            running                394ccf8  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
fervent_raman    docker-container
  fervent_raman0 unix:///var/run/docker.sock            running                v0.10.3  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux                                           protocol not available
desktop-windows                                         protocol not available
remote-buildkit                                         error during connect: Get "http://docker.example.com/_ping": command [ssh -- mini docker system dial-stdio] has exited with exit status 255, please make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=ssh: Could not resolve hostname mini: Name or service not known
default          docker
  default        default                                running 20.10.14 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6