Environment
RHEL 8
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.4 (Ootpa)
Docker 20.10.9 (Swarm mode)
$ docker version
Client: Docker Engine - Community
Version: 20.10.9
API version: 1.41
Go version: go1.16.8
Git commit: c2ea9bc
Built: Mon Oct 4 16:08:25 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.9
API version: 1.41 (minimum version 1.12)
Go version: go1.16.8
Git commit: 79ea9d3
Built: Mon Oct 4 16:06:48 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.11
GitCommit: 5b46e404f6b9f661a205e28d59c982d3634148f8
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Traefik 2.5
$ docker exec -it $(docker ps -f name=example_reverse-proxy -q) traefik version
Version: 2.5.3
Codename: livarot
Go version: go1.17.1
Built: 2021-09-20T15:43:56Z
OS/Arch: linux/amd64
Set up the deployment
Make a Traefik Quick Start deployment for Swarm mode.
# docker-compose.yml
version: '3'
services:
reverse-proxy:
# The official v2 Traefik docker image
image: traefik:v2.5
# Enables the web UI and tells Traefik to listen to docker
command:
- --api.insecure=true
- --providers.docker
- --providers.docker.swarmMode=true
- --providers.docker.exposedbydefault=false
- --entrypoints.http.address=:80
- --accesslog
- --log.level=DEBUG
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints:
- node.role == manager
labels:
traefik.enable: "true"
traefik.docker.network: "example_default"
whoami:
# A container that exposes an API to show its IP address
image: traefik/whoami
deploy:
labels:
traefik.enable: "true"
traefik.http.routers.whoami.rule: "Host(`whoami.docker.localhost`)"
traefik.http.routers.whoami.entrypoints: http
traefik.http.services.whoami.loadbalancer.server.port: "80"
traefik.docker.network: "example_default"
Deploy it.
$ docker stack deploy -c docker-compose.yml example
Creating network example_default
Creating service example_reverse-proxy
Creating service example_whoami
Verify deployment status.
$ docker ps -af "label=com.docker.stack.namespace=example"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
803fd46c403e traefik/whoami:latest "/whoami" 22 seconds ago Up 20 seconds 80/tcp example_whoami.1.bmeduo3gsjshcidh4gtsh1ugb
0b7cdd777212 traefik:v2.5 "/entrypoint.sh --ap…" 24 seconds ago Up 22 seconds 80/tcp example_reverse-proxy.1.klt5b7p4cea2fx9kipnzadt9w
Verify DOCKER-INGRESS firewall chain is configured.
$ sudo iptables -n -L DOCKER-INGRESS
Chain DOCKER-INGRESS (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED tcp spt:8080
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED tcp spt:80
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Verify connectivity.
$ curl -v -H Host:whoami.docker.localhost http://127.0.0.1
* Rebuilt URL to: http://127.0.0.1/
* Uses proxy env variable no_proxy == '127.0.0.1,localhost,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16'
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host:whoami.docker.localhost
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 376
< Content-Type: text/plain; charset=utf-8
< Date: Wed, 03 Nov 2021 17:37:44 GMT<
Hostname: 6f83977ba1b7
IP: 127.0.0.1
IP: 10.0.18.6
IP: 172.18.0.3
RemoteAddr: 10.0.18.3:36668
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/7.61.1
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.0.0.2
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: ec90f31b38fb
X-Real-Ip: 10.0.0.2
* Connection #0 to host 127.0.0.1 left intact
Break it
Reload firewalld.
$ sudo firewall-cmd --reload
success
Verify the DOCKER-INGRESS chain was removed.
$ sudo iptables -n -L DOCKER-INGRESS
iptables: No chain/target/match by that name.
Verify lack of connectivity.
$ curl -v -H Host:whoami.docker.localhost http://127.0.0.1
* Rebuilt URL to: http://127.0.0.1/
* Uses proxy env variable no_proxy == '127.0.0.1,localhost,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16'
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host:whoami.docker.localhost
> User-Agent: curl/7.61.1
> Accept: */*
>
Additional notes
Docker's firewalld zone persists on reload. Can Traefik use that?
$ sudo firewall-cmd --zone=docker --list-all
docker (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: docker0 docker_gwbridge
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Debug log
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=info msg="Configuration loaded from flags."
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=info msg="Traefik version 2.5.3 built on 2021-09-20T15:43:56Z"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Static configuration loaded {\"global\":{\"checkNewVersion\":true},\"serversTransport\":{\"maxIdleConnsPerHost\":200},\"entryPoints\":{\"http\":{\"address\":\":80\",\"transport\":{\"lifeCycle\":{\"graceTimeOut\":\"10s\"},\"respondingTimeouts\":{\"idleTimeout\":\"3m0s\"}},\"forwardedHeaders\":{},\"http\":{},\"udp\":{\"timeout\":\"3s\"}},\"traefik\":{\"address\":\":8080\",\"transport\":{\"lifeCycle\":{\"graceTimeOut\":\"10s\"},\"respondingTimeouts\":{\"idleTimeout\":\"3m0s\"}},\"forwardedHeaders\":{},\"http\":{},\"udp\":{\"timeout\":\"3s\"}}},\"providers\":{\"providersThrottleDuration\":\"2s\",\"docker\":{\"watch\":true,\"endpoint\":\"unix:///var/run/docker.sock\",\"defaultRule\":\"Host(`{{ normalize .Name }}`)\",\"swarmMode\":true,\"swarmModeRefreshSeconds\":\"15s\"}},\"api\":{\"insecure\":true,\"dashboard\":true},\"log\":{\"level\":\"DEBUG\",\"format\":\"common\"},\"accessLog\":{\"format\":\"common\",\"filters\":{},\"fields\":{\"defaultMode\":\"keep\",\"headers\":{\"defaultMode\":\"drop\"}}},\"pilot\":{\"dashboard\":true}}"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=info msg="\nStats collection is disabled.\nHelp us improve Traefik by turning this feature on :)\nMore details on: https://doc.traefik.io/traefik/contributing/data-collection/\n"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=info msg="Starting provider aggregator.ProviderAggregator {}"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Start TCP Server" entryPointName=traefik
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Start TCP Server" entryPointName=http
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=info msg="Starting provider *acme.ChallengeTLSALPN {\"Timeout\":4000000000}"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=info msg="Starting provider *docker.Provider {\"watch\":true,\"endpoint\":\"unix:///var/run/docker.sock\",\"defaultRule\":\"Host(`{{ normalize .Name }}`)\",\"swarmMode\":true,\"swarmModeRefreshSeconds\":\"15s\"}"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=info msg="Starting provider *traefik.Provider {}"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Configuration received from provider internal: {\"http\":{\"routers\":{\"api\":{\"entryPoints\":[\"traefik\"],\"service\":\"api@internal\",\"rule\":\"PathPrefix(`/api`)\",\"priority\":2147483646},\"dashboard\":{\"entryPoints\":[\"traefik\"],\"middlewares\":[\"dashboard_redirect@internal\",\"dashboard_stripprefix@internal\"],\"service\":\"dashboard@internal\",\"rule\":\"PathPrefix(`/`)\",\"priority\":2147483645}},\"services\":{\"api\":{},\"dashboard\":{},\"noop\":{}},\"middlewares\":{\"dashboard_redirect\":{\"redirectRegex\":{\"regex\":\"^(http:\\\\/\\\\/(\\\\[[\\\\w:.]+\\\\]|[\\\\w\\\\._-]+)(:\\\\d+)?)\\\\/$\",\"replacement\":\"${1}/dashboard/\",\"permanent\":true}},\"dashboard_stripprefix\":{\"stripPrefix\":{\"prefixes\":[\"/dashboard/\",\"/dashboard\"]}}},\"serversTransports\":{\"default\":{\"maxIdleConnsPerHost\":200}}},\"tcp\":{},\"tls\":{}}" providerName=internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="No default certificate, generating one" tlsStoreName=default
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Provider connection established with docker 20.10.9 (API 1.41)" providerName=docker
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Configuration received from provider docker: {\"http\":{\"routers\":{\"whoami\":{\"entryPoints\":[\"http\"],\"service\":\"whoami\",\"rule\":\"Host(`whoami.docker.localhost`)\"}},\"services\":{\"whoami\":{\"loadBalancer\":{\"servers\":[{\"url\":\"http://10.0.19.6:80\"}],\"passHostHeader\":true}}}},\"tcp\":{},\"udp\":{}}" providerName=docker
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Added outgoing tracing middleware api@internal" middlewareType=TracingForwarder entryPointName=traefik routerName=api@internal middlewareName=tracing
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Added outgoing tracing middleware dashboard@internal" entryPointName=traefik routerName=dashboard@internal middlewareName=tracing middlewareType=TracingForwarder
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Creating middleware" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_stripprefix@internal middlewareType=StripPrefix
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Adding tracing to middleware" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_stripprefix@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Creating middleware" middlewareName=dashboard_redirect@internal middlewareType=RedirectRegex entryPointName=traefik routerName=dashboard@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Setting up redirection from ^(http:\\/\\/(\\[[\\w:.]+\\]|[\\w\\._-]+)(:\\d+)?)\\/$ to ${1}/dashboard/" middlewareName=dashboard_redirect@internal middlewareType=RedirectRegex entryPointName=traefik routerName=dashboard@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Adding tracing to middleware" routerName=dashboard@internal middlewareName=dashboard_redirect@internal entryPointName=traefik
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="Creating middleware" middlewareName=traefik-internal-recovery middlewareType=Recovery entryPointName=traefik
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:47Z" level=debug msg="No default certificate, generating one" tlsStoreName=default
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Creating middleware" middlewareType=Pipelining entryPointName=http routerName=whoami@docker serviceName=whoami middlewareName=pipelining
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Creating load-balancer" entryPointName=http routerName=whoami@docker serviceName=whoami
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Creating server 0 http://10.0.19.6:80" entryPointName=http routerName=whoami@docker serviceName=whoami serverName=0
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="child http://10.0.19.6:80 now UP"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Propagating new UP status"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Added outgoing tracing middleware whoami" middlewareType=TracingForwarder entryPointName=http routerName=whoami@docker middlewareName=tracing
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Creating middleware" middlewareName=traefik-internal-recovery middlewareType=Recovery entryPointName=http
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Added outgoing tracing middleware api@internal" entryPointName=traefik middlewareName=tracing middlewareType=TracingForwarder routerName=api@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Added outgoing tracing middleware dashboard@internal" entryPointName=traefik routerName=dashboard@internal middlewareName=tracing middlewareType=TracingForwarder
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Creating middleware" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_stripprefix@internal middlewareType=StripPrefix
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Adding tracing to middleware" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_stripprefix@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Creating middleware" routerName=dashboard@internal middlewareType=RedirectRegex middlewareName=dashboard_redirect@internal entryPointName=traefik
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Setting up redirection from ^(http:\\/\\/(\\[[\\w:.]+\\]|[\\w\\._-]+)(:\\d+)?)\\/$ to ${1}/dashboard/" entryPointName=traefik routerName=dashboard@internal middlewareType=RedirectRegex middlewareName=dashboard_redirect@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Adding tracing to middleware" routerName=dashboard@internal middlewareName=dashboard_redirect@internal entryPointName=traefik
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:10:48Z" level=debug msg="Creating middleware" middlewareName=traefik-internal-recovery middlewareType=Recovery entryPointName=traefik
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:02Z" level=debug msg="Configuration received from provider docker: {\"http\":{\"routers\":{\"dashboard\":{\"service\":\"api@internal\",\"rule\":\"Host(`traefik.docker.localhost`) \\u0026\\u0026 (PathPrefix(`/api`) || PathPrefix(`/dashboard`))\"},\"whoami\":{\"entryPoints\":[\"http\"],\"service\":\"whoami\",\"rule\":\"Host(`whoami.docker.localhost`)\"}},\"services\":{\"dashboard\":{\"loadBalancer\":{\"servers\":[{\"url\":\"http://10.0.19.3:9999\"}],\"passHostHeader\":true}},\"whoami\":{\"loadBalancer\":{\"servers\":[{\"url\":\"http://10.0.19.6:80\"}],\"passHostHeader\":true}}}},\"tcp\":{},\"udp\":{}}" providerName=docker
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:02Z" level=debug msg="No entryPoint defined for this router, using the default one(s) instead: [http]" routerName=dashboard
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:02Z" level=debug msg="No default certificate, generating one" tlsStoreName=default
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Added outgoing tracing middleware api@internal" routerName=api@internal middlewareName=tracing middlewareType=TracingForwarder entryPointName=traefik
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Added outgoing tracing middleware dashboard@internal" entryPointName=traefik routerName=dashboard@internal middlewareName=tracing middlewareType=TracingForwarder
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Creating middleware" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_stripprefix@internal middlewareType=StripPrefix
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Adding tracing to middleware" middlewareName=dashboard_stripprefix@internal entryPointName=traefik routerName=dashboard@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Creating middleware" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_redirect@internal middlewareType=RedirectRegex
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Setting up redirection from ^(http:\\/\\/(\\[[\\w:.]+\\]|[\\w\\._-]+)(:\\d+)?)\\/$ to ${1}/dashboard/" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_redirect@internal middlewareType=RedirectRegex
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Adding tracing to middleware" entryPointName=traefik routerName=dashboard@internal middlewareName=dashboard_redirect@internal
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Creating middleware" entryPointName=traefik middlewareName=traefik-internal-recovery middlewareType=Recovery
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Creating middleware" entryPointName=http serviceName=whoami routerName=whoami@docker middlewareName=pipelining middlewareType=Pipelining
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Creating load-balancer" routerName=whoami@docker entryPointName=http serviceName=whoami
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Creating server 0 http://10.0.19.6:80" routerName=whoami@docker entryPointName=http serviceName=whoami serverName=0
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="child http://10.0.19.6:80 now UP"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Propagating new UP status"
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Added outgoing tracing middleware whoami" routerName=whoami@docker middlewareName=tracing middlewareType=TracingForwarder entryPointName=http
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Added outgoing tracing middleware api@internal" entryPointName=http routerName=dashboard@docker middlewareName=tracing middlewareType=TracingForwarder
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:03Z" level=debug msg="Creating middleware" middlewareName=traefik-internal-recovery middlewareType=Recovery entryPointName=http
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:17Z" level=debug msg="Configuration received from provider docker: {\"http\":{\"routers\":{\"dashboard\":{\"service\":\"api@internal\",\"rule\":\"Host(`traefik.docker.localhost`) \\u0026\\u0026 (PathPrefix(`/api`) || PathPrefix(`/dashboard`))\"},\"whoami\":{\"entryPoints\":[\"http\"],\"service\":\"whoami\",\"rule\":\"Host(`whoami.docker.localhost`)\"}},\"services\":{\"dashboard\":{\"loadBalancer\":{\"servers\":[{\"url\":\"http://10.0.19.3:9999\"}],\"passHostHeader\":true}},\"whoami\":{\"loadBalancer\":{\"servers\":[{\"url\":\"http://10.0.19.6:80\"}],\"passHostHeader\":true}}}},\"tcp\":{},\"udp\":{}}" providerName=docker
example_reverse-proxy.1.rna6y8g2xsbh@localhost | time="2021-11-03T18:11:17Z" level=info msg="Skipping same configuration" providerName=docker