Using this dockerfile, you can build an image that is only 909 kB big:
jannnash/noop 0.1.0 044121226051 19 seconds ago 909 kB
The image is so small because it's a base image built from scratch (that pun is to be blamed on the docker-folks :D), which includes the statically (that's why it's 'so big') compiled version of noop.c.
Running a container built from this image does obviously not make any sense, so what do you use it for? Now, docker-compose version 3 does not yet support a functionality similar to (or at least similarly simple as) the
extends-functionality that could be used in version 2 to get rid of repeated configuration in your compose-file.
I hacked this together because I wanted to share environment variables between some services in the docker-compose file I'm using for a small project. Having to update the same path at 4 different places simply is a pain, so I searched for a way to deduplicate configurations.
On a MacBook Air Early 2015 with a 2.2 i7 and 8G RAM (everything timed once with 'time'),
- building the image takes only quarter of a second
- creating a container from the image takes around .9 of a second
- running the container takes around 2 seconds
The image has a size of 909 kB and a container created from the image has no extra size overhead to the image.
In conclusion, the workaround does not really create any overhead for your docker-compose setup apart from creating some extra containers, which clutter the output of
docker ps -a.
If anyone wants to elaborate on anchors and references in .yml, feel free to send me a PR with an extended version of this README. Personally, I think, it's fairly simple, so I will let this sample docker-compose configuration speak for itself:
version: '3' volumes: quak: services: common-env: build: context: ./noop image: noop container_name: common-env environment: &foo FOO_CONTAINER: foo environment: &foo_env FOO_CONTAINER_BAZ: baz environment: &bar BAR_CONTAINER: bar environment: &bar_env BAR_CONTAINER_BOING: boing environment: - &oink ./oink:/usr/share/oink - &quak quak:/usr/share/quak foo: container_name: foo image: debian:jessie-slim volumes: - *oink environment: <<: *foo_env bar: container_name: bar image: debian:jessie-slim volumes: - *quak environment: <<: *bar_env klonk: image: debian:jessie-slim volumes: - *oink - *quak environment: <<: *foo <<: *bar <<: *foo_env <<: *bar_env