slimtoolkit / slimtoolkit/slim

Non usable python-gunicorn docker slimed image

Open
#579 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Go
Stars
23.4k
Forks
840
PR merge metrics
No merged PRs in 30d

Description

Hi all. I have been several days trying to reduce my image size using slim. The image contains three important directories in / that I want to preserve: /code, /venv and /models. It consists of a ubuntu-based cuda image that runs a gunicorn python app that exposes an API.

This is the command that I'm running to slim the image:

slim build \                                                                                                                                                                                                                          (AI-792-investigate-how-we-can-reduce-docker-image-size|✚3…103)
--publish-exposed-ports \
--expose 8080 \
--compose-env-file .env \
--http-probe=false \
--include-path /code \
--include-path /bin \
--include-path /models \
--include-path /venv \
ai-backend:latest-gpu
cmd=build info=exec message='changing continue-after from probe to nothing because http-probe is disabled'
cmd=build info=exec message='changing continue-after to enter'
cmd=build state=started
cmd=build info=params target='ai-backend:latest-gpu' continue.mode='enter' rt.as.user='true' keep.perms='true' tags='' target.type='image'
cmd=build state=image.inspection.start
cmd=build info=image id='sha256:f123cc0e8ad9821f81801019164333e31cc7cbdc8fb170b0e011cfd72d8e6412' size.bytes='14583660396' size.human='15 GB'
cmd=build info=image.stack index='0' name='base-cudnn8-cuda11-ubuntu20.04:98360d7dde8a43a2c4d937cba0573ae7ef5e356b' id='sha256:286383a731a373c0991793a46b9e59cae715e9dd238c5ac26045ce6eb944d4a3'
cmd=build info=image.stack index='1' name='ai-backend:0.14.1-cuda11-98360d7dde8a43a2c4d937cba0573ae7ef5e356b' id='sha256:f123cc0e8ad9821f81801019164333e31cc7cbdc8fb170b0e011cfd72d8e6412'
cmd=build state=image.inspection.done
cmd=build state=container.inspection.start
cmd=build info=container id='bb9a5c5d6fce468e420317dfa5cdd6b2286182d24624ed23352d895e2963857b' status='created' name='slimk_102841_20230912091453'
cmd=build info=container status='running' name='slimk_102841_20230912091453' id='bb9a5c5d6fce468e420317dfa5cdd6b2286182d24624ed23352d895e2963857b'
cmd=build info=container message='obtained IP address' ip='172.17.0.2'
cmd=build info=cmd.startmonitor status='sent'
cmd=build info=event.startmonitor.done status='received'
cmd=build info=container id='bb9a5c5d6fce468e420317dfa5cdd6b2286182d24624ed23352d895e2963857b' target.port.list='8080' target.port.info='8080/tcp => 0.0.0.0:8080' message='YOU CAN USE THESE PORTS TO INTERACT WITH THE CONTAINER' name='slimk_102841_20230912091453'
cmd=build info=continue.after mode='enter' message='provide the expected input to allow the container inspector to continue its execution'
cmd=build prompt='USER INPUT REQUIRED, PRESS <ENTER> WHEN YOU ARE DONE USING THE CONTAINER'

cmd=build state=container.inspection.finishing
cmd=build state=container.inspection.artifact.processing
cmd=build state=container.inspection.done
cmd=build state=building message="building optimized image" engine=internal
cmd=build state=completed
cmd=build info=results status='MINIFIED' by='3.28X' size.original='15 GB' size.optimized='4.5 GB'
cmd=build info=results image.size='4.5 GB' has.data='true' image.name='ai-backend.slim'
cmd=build info=results artifacts.location='/tmp/slim-state/.slim-state/images/f123cc0e8ad9821f81801019164333e31cc7cbdc8fb170b0e011cfd72d8e6412/artifacts'
cmd=build info=results artifacts.report='creport.json'
cmd=build info=results artifacts.dockerfile.reversed='Dockerfile.fat'
cmd=build info=results artifacts.dockerfile.optimized='Dockerfile'
cmd=build info=results artifacts.seccomp='ai-backend-seccomp.json'
cmd=build info=results artifacts.apparmor='ai-backend-apparmor-profile'
cmd=build state=done
cmd=build info=commands message='use the xray command to learn more about the optimize image'
cmd=build info=report file='slim.report.json'
app='slim' message='GitHub Discussions' info='https://github.com/slimtoolkit/slim/discussions'
app='slim' message='Join the CNCF Slack channel to ask questions or to share your feedback' info='https://cloud-native.slack.com/archives/C059QP1RH1S'
app='slim' message='Join the Discord server to ask questions or to share your feedback' info='https://discord.gg/9tDyxYS'
app='slim' message='Join the Gitter channel to ask questions or to share your feedback' info='https://gitter.im/docker-slim/community'

This is the entrypoint defined in the image, defined in /docker-entrypoint.sh:

#! /bin/bash

set -eo pipefail
source /venv/bin/activate

if [ -z "$1" ]; then
echo "Please, add a command to run this docker image"
exit 1
fi

$@

When I run the slim build command I interact with the container to run the following gunicorn command:

/docker-entrypoint.sh "gunicorn --forwarded-allow-ips '''*''' -b 0.0.0.0:8080 --max-requests 5 --threads 1 -k uvicorn.workers.UvicornWorker --preload bin.api:main()"

From outside the container I query the api using curl and it answers correctly. I also run the python interpreter to make slim understand that I want it. Anyway, when I press enter and slim creates the slim image, I try to enter into a container but the image has become unusable:

> docker run -p 8080:8080 -ti ai-backend.slim:latest bash
(venv) /docker-entrypoint.sh "gunicorn --forwarded-allow-ips '''*''' -b 0.0.0.0:8080 --max-requests 5 --threads 1 -k uvicorn.workers.UvicornWorker --preload bin.api:main()"
/docker-entrypoint.sh: /venv/bin/gunicorn: /venv/bin/python3: bad interpreter: No such file or directory

I would be very grateful if someone could help me, please.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the slim build with /docker-entrypoint.sh and the shown gunicorn command, then inspect the generated optimized image and the /venv/bin/gunicorn entry point. Compare the working container with the slim image; done means the slim image starts the API successfully and /venv/bin/gunicorn no longer reports a missing Python interpreter.

Written by the indexing model from the issue text.

Assessment

Tech stack
bash, docker, python
Domain
build-system, devops
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.