docker/compose

Mapping range of ports from container to host with scale errors

ajskateboarder opened this issue · 3 comments

Description
I am trying to run a few FastAPI instances with the same route. The main file to start the server chooses a random port from 8000 to 8010.

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=random.randrange(8000, 8010))

My docker-compose yml file looks like this:

version: '3.9'

services:
  api:
    build: .
    ports:
      - "8080-8010:8080-8010"

Steps to reproduce the issue:

  1. Create a simple FastAPI server with one route and a starter file that runs the app with uvicorn and chooses a random port
  2. Use the provided compose file

Describe the results you received:
Command I used to start Docker Compose:

docker compose up --scale=5
[+] Running 2/0
 ⠿ Container some-api-2  Recreated                                                                                                                        0.1s
 ⠿ Container some-api-1  Recreated                                                                                                                        0.1s
Attaching to some-api-1, ytstars-api-2
Error response from daemon: driver failed programming external connectivity on endpoint some-api-2: Bind for 0.0.0.0:8010 failed: port is already allocated

Describe the results you expected:

Additional information you deem important (e.g. issue happens only occasionally):

Output of docker compose version:

Docker Compose version v2.6.0

Output of docker info:

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
  compose: Docker Compose (Docker Inc., v2.6.0)
  scan: Docker Scan (Docker Inc., v0.17.0)

Server:
 Containers: 2
  Running: 1
  Paused: 0
  Stopped: 1
 Images: 11
 Server Version: 20.10.17
 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: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc version: v1.1.2-0-ga916309
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.16.3-microsoft-standard-WSL2
 Operating System: Ubuntu 20.04.4 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 15.54GiB
 Name: vortex
 ID: VE5W:P4DU:3P32:RM4L:FZVW:MGBB:LTVY:DY6N:TYLL:QF2W:5W5N:BTRS
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support

Additional environment details:

This could simply be giving an error because Docker could explicitly check any process that starts up after the first to see if it is being mapped with the same range of ports.

AFAICT this has been fixed by #10067
Could you please try to reproduce with latest release (v2.17.3) ?

AFAICT this has been fixed by #10067 Could you please try to reproduce with latest release (v2.17.3) ?

I can confirm that this version fixes my issue. Thanks