Home > Software engineering >  Docker: how to run multiple binaries in a stripped-down "distroless" image?
Docker: how to run multiple binaries in a stripped-down "distroless" image?

Time:08-13

I have a Dockerfile that is currently using amazonlinux as the base image.

The purpose of the image is to run two binaries in the container. Consequently, the CMD instruction of the Dockerfile currently looks like this:

CMD [ "/bin/sh", "-c", "/binary1 & /binary2"]

I am looking to modify this Dockerfile to migrate it to a "distroless" image. This entails modifying the Dockerfile FROM to be built on top of a stripped-down base image (which will itself be Linux-based).

My problem is that this new stripped-down base image will no longer contain the "&" that previously came with the shell in the prior Linux image. It does not have "&&" either, or for that matter any operator that would enable me to run both binaries from within the Dockerfile.

I am wondering if there is some way to run multiple binaries in a stripped down image like this?

For example, perhaps I can install the files containing "&", "&&", or some similar command in my Dockerfile to accomplish this, since the new "distroless" image will still be Linux based? If so, how can I determine which specific files I would need, and how can I install them?

Any pointers would be appreciated, as I am quite new to Docker.

CodePudding user response:

Any pointers would be appreciated, as I am quite new to Docker.

In general, don't try running multiple binaries in a single container like this. In almost all cases, it is more flexible and management to run two separate containers: so if you were to build a "distroless" image containining your two binaries, you would start two containers from the same image (e.g. docker run myimage binary1 and docker run myimage binary2).

When you do something like...

CMD [ "/bin/sh", "-c", "/binary1 & /binary2"]

...you have made failures of binary1 invisible to Docker: if the command fails, your container will merrily keep running, and you can't use a restart policy to restart it for you automatically.


Alternately, if you really want to do the thing you're trying to do, rather than using a "distroless" base image, consider instead using a minimal image like busybox or alpine: these will provide you with a shell and common unix utilities for debugging work, but are still quite small.

  • Related