Challenge, Medium,  on  Containers

One of the application types that Docker allows to containerize is CLI tools. For instance, httpie, a user-friendly command-line HTTP client, has a popular containerized version alpine/httpie.

Running the alpine/httpie image with no arguments prints httpie's help message:

docker run alpine/httpie

Running the alpine/httpie image with a single URL argument makes an HTTP GET request to it and prints the response:

docker run alpine/httpie https://github.com

But what if you wanted to launch a shell in the alpine/httpie image instead of running the httpie binary? It's a totally valid requirement when you want to explore the contents of the container.

Can you do it?

Hint 1: CMD vs. ENTRYPOINT 💡

The only mandatory argument of the docker run command is the image name. When invoked in its shortest form (e.g., docker run alpine/httpie), Docker launches the container's default command, which is in turn a combination of two image's attributes: Cmd and Entrypoint.

Run the following command and locate them:

docker image inspect alpine/httpie
Hint 2: Overriding container's entrypoint 💡

The alpine/httpie image has the entrypoint set to the http binary (i.e., the HTTP build of the httpie client). It means that executing docker run alpine/httpie with additional arguments will pass them as extra arguments to the containerized http command. This is why running the following two commands produces the same results:

# no prior httpie installation required
docker run alpine/httpie https://labs.iximiuz.com

# requires prior httpie installation
http https://labs.iximiuz.com

But there should be a way to override the entrypoint of a container. Look for the relevant part in the docker run --help output.

Hint 3: Running an interactive shell container 💡

If you're not sure how to launch an interactive shell in a container, try solving these challenges first:

Level up your Server Side game — Join 11,000 engineers who receive insightful learning materials straight to their inbox