Changing port maps in Docker Compose
When using Docker Compose, I often map the ports to local ones in the compose.yaml like this:
services: web: build: context: ./docker/web ports: - "8080:80"
Adding to the port map
If port 8080 is in use already on a developer’s machine, then we can add a new mapping using compose.override.yaml
services: web: build: context: ./docker/web ports: - "8081:80"
The compose.override.yaml file is merged with the compose.yaml file and the effective configuration is now:
services: web: build: context: ./docker/web ports: - "8080:80" - "8081:80"
Replacing the port map
If we want to replace the original mapping with our new one, then we need the !override keyword in our compose.override.yaml file like this:
services: web: build: context: ./docker/web ports: !override - "8081:80"
Now the original mapping to port 8080 is removed as our new ports definition overrides the original, rather than being merged with it and so the effective configuration is:
services: web: build: context: ./docker/web ports: - "8081:80"
Removing the port map
If we want to remove the port mapping completely, we use !reset in our compose.override.yaml file:
services: web: build: context: ./docker/web ports: !reset []
Now, the ports property is completely removed, so the effective configuration is now:
services: web: build: context: ./docker/web
Note that you’d use !reset null, if you are removing a scalar, such as an environment variable.
Fin
The !override and !reset attributes work for any Compose property and while I’m sure they’ve been available for years, I’ve only just found out about them!
Another thing I recently learned is that docker-compose.yaml is only supported for backwards compatibility and the Docker Compose configuration file name is now compose.yaml.