Motivating examples

Specifying dependencies

RUN apt-get update && \
    apt-get install -y \
    libssl1.1 \
    libjson-glib-1.0-0 \
    libgstreamer1.0-0 \
    gstreamer1.0-tools \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    libgstrtspserver-1.0-0 \
    libjansson4 \
    make \
    git \
    wget \
    checkinstall

Dependency hell + destructive updates

https://en.wikipedia.org/wiki/Dependency_hell

tomas.krupka@yersinia:~$ pip install awscli

...

Collecting awscli
Collecting s3transfer<0.11.0,>=0.10.0
Collecting botocore==1.34.23

...

Installing collected packages: botocore, s3transfer, awscli
  Attempting uninstall: botocore
    Found existing installation: botocore 1.31.30
    Uninstalling botocore-1.31.30:
      Successfully uninstalled botocore-1.31.30
...

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
WARNING: boto3 1.28.30 requires botocore<1.32.0,>=1.31.30, but you have botocore 1.34.23 which is incompatible.
WARNING: boto3 1.28.30 requires s3transfer<0.7.0,>=0.6.0, but you have s3transfer 0.10.0 which is incompatible.
Successfully installed awscli-1.32.23 botocore-1.34.23 s3transfer-0.10.0

Multiple software versions and variants

pip install conan==1.59
pip install conan==2.0

apt install opencv
apt install opencv-with-cuda

What happens if an update fails?

  1. The update process itself fails:
apt-get update && apt-get upgrade
...
CTRL+C
  1. The result of the update is undesired
error: invalid magic number
error: you need to load kernel first