rootless-containers / slirp4netns

User-mode networking for unprivileged network namespaces
GNU General Public License v2.0
729 stars 82 forks source link

External ports: Error response from daemon: driver failed programming external connectivity 20.10.6 #262

Closed MarkErik closed 3 years ago

MarkErik commented 3 years ago

Running containers with external ports e.g. docker run -p 80:80 nginx:alpine via slirp4netns gives the error: docker: Error response from daemon: driver failed programming external connectivity on endpoint hopeful_sutherland (8c9b3947fc854769b2556cdefbd45da23091f883681ec8113eefa3c1b4c49876): Timed out proxy starting the userland proxy.

Originally experienced this error when running on a machine that I had upgraded docker 20.10.5 to .6 with slirp4netns 1.1.9. After the upgrade my Traefik container wouldn't start up.

Things I have tried:

mark@vultr:~$ docker -v
Docker version 20.10.6, build 370c289
mark@vultr:~$ slirp4netns -v
slirp4netns version 1.1.9
commit: 4e37ea557562e0d7a64dc636eff156f64927335e
libslirp: 4.4.0
SLIRP_CONFIG_VERSION_MAX: 3
libseccomp: 2.3.3
mark@vultr:~$ docker run -p 80:80 nginx:alpine
Unable to find image 'nginx:alpine' locally
alpine: Pulling from library/nginx
540db60ca938: Pull complete 
197dc8475a23: Pull complete 
39ea657007e5: Pull complete 
37afbf7d4c3d: Pull complete 
0c01f42c3df7: Pull complete 
d590d87c9181: Pull complete 
Digest: sha256:07ab71a2c8e4ecb19a5a5abcfb3a4f175946c001c8af288b1aa766d67b0d05d2
Status: Downloaded newer image for nginx:alpine
docker: Error response from daemon: driver failed programming external connectivity on endpoint hopeful_sutherland (8c9b3947fc854769b2556cdefbd45da23091f883681ec8113eefa3c1b4c49876): Timed out proxy starting the userland proxy.
ERRO[0017] error waiting for container: context canceled  

If I change the driver to 'builtin' (using nano) and restart the docker service, you can see that it works again.

mark@vultr:~$ nano ~/.config/systemd/user/docker.service
mark@vultr:~$ systemctl --user daemon-reload
mark@vultr:~$ systemctl --user restart docker
mark@vultr:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
mark@vultr:~$ docker run -p 80:80 nginx:alpine
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
AkihiroSuda commented 3 years ago

Not slirp4netns issue. Fixed in https://github.com/moby/moby/pull/42294 (will be included in Docker 20.10.7)