Feature Request: Clearer error message when unable to connect to docker
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 7.2k
- Forks
- 1.7k
- Avg merge
- 13d 8h
- Merged PRs (30d)
- 2
Description
TLDR: Add exception handlers on docker/tranport/unixconn.py to print user friendly error message that docker daemon is unreachable.
Description
I set up a fresh install of docker on a new Apple Macbook (running Apple Silicon). When I ran docker-compose up, I got a cryptic error message. Further investigation showed that the docker daemon was not running. However, the error messages are very arcane and a junior dev would not have known what the issue is.
Proposed fix: Instead of printing docker transport stack traces, provide user friendly notification asking user to verify docker is running.
Steps to reproduce the issue:
- Install docker on apple macbook, using factory settings
- reboot machine, so that docker daemon is off
- Run docker compose, observe cryptic stack trace:
Describe the results you received:
Stack trace:
docker-compose -f docker/docker-compose.yml up --build
Traceback (most recent call last):
File "urllib3/connectionpool.py", line 670, in urlopen
File "urllib3/connectionpool.py", line 392, in _make_request
File "http/client.py", line 1255, in request
File "http/client.py", line 1301, in _send_request
File "http/client.py", line 1250, in endheaders
File "http/client.py", line 1010, in _send_output
File "http/client.py", line 950, in send
File "docker/transport/unixconn.py", line 43, in connect
FileNotFoundError: [Errno 2] No such file or directory
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "requests/adapters.py", line 439, in send
File "urllib3/connectionpool.py", line 726, in urlopen
File "urllib3/util/retry.py", line 410, in increment
File "urllib3/packages/six.py", line 734, in reraise
File "urllib3/connectionpool.py", line 670, in urlopen
File "urllib3/connectionpool.py", line 392, in _make_request
File "http/client.py", line 1255, in request
File "http/client.py", line 1301, in _send_request
File "http/client.py", line 1250, in endheaders
File "http/client.py", line 1010, in _send_output
File "http/client.py", line 950, in send
File "docker/transport/unixconn.py", line 43, in connect
urllib3.exceptions.ProtocolError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "docker/api/client.py", line 214, in _retrieve_server_version
File "docker/api/daemon.py", line 181, in version
File "docker/utils/decorators.py", line 46, in inner
File "docker/api/client.py", line 237, in _get
File "requests/sessions.py", line 543, in get
File "requests/sessions.py", line 530, in request
File "requests/sessions.py", line 643, in send
File "requests/adapters.py", line 498, in send
requests.exceptions.ConnectionError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "docker-compose", line 3, in <module>
File "compose/cli/main.py", line 81, in main
File "compose/cli/main.py", line 200, in perform_command
File "compose/cli/command.py", line 60, in project_from_options
File "compose/cli/command.py", line 152, in get_project
File "compose/cli/docker_client.py", line 41, in get_client
File "compose/cli/docker_client.py", line 170, in docker_client
File "docker/api/client.py", line 197, in __init__
File "docker/api/client.py", line 221, in _retrieve_server_version
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
[23301] Failed to execute script docker-compose
Describe the results you expected:
As we can see, we get multiple stack traces from docker. Luckily, someone with networking knowledge can realize that the key parts are docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.' and docker/transport/unixconn.py", line 43, in connect, thus leading the user to check the docker connection status. However, this is not at all intuitive.
It would be much better to have a try/except block that can catch these errors, then run a quick ping check on the docker socket and print a friendly user messages saying "Docker is unreachable, please verify docker service is running and accessible on $docker_conn_socket, where $docker_conn_socket is whatever is specified in the daemon.
Additional information you deem important (e.g. issue happens only occasionally):
This will disproportionally impact new users of docker who are junior devs. We should make this more friendly to them.
Output of docker compose version:
Docker Compose version v2.0.0
Output of docker info:
Factory settings on Apple Silicon:
Client:
Context: default
Debug Mode: false
Plugins:
buildx: Build with BuildKit (Docker Inc., v0.6.3)
compose: Docker Compose (Docker Inc., v2.0.0)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 2
Running: 0
Paused: 0
Stopped: 2
Images: 9
Server Version: 20.10.8
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: e25210fe30a0a703442421b0f60afac609f950a3
runc version: v1.0.1-0-g4144b63
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 5.10.47-linuxkit
Operating System: Docker Desktop
OSType: linux
Architecture: aarch64
CPUs: 5
Total Memory: 1.942GiB
Name: docker-desktop
ID: PRTC:U5RD:K2GE:N7A4:346H:SFMO:LB7O:KWRS:Q6HC:NB3F:JTCV:C3XT
Docker Root Dir: /var/lib/docker
Debug Mode: false
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Additional environment details:
N/A, this is a docker internal issue.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in docker/transport/unixconn.py and trace how the docker-compose command reaches the Docker client when the Unix socket is unavailable. Reproduce the failure with docker-compose -f docker/docker-compose.yml up --build; done means the cryptic stack traces are replaced with a friendly unreachable-daemon message that identifies the configured socket.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker, python
- Domain
- api
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100