Merge pull request #2386 from nicolargo/improve-docker-images

chg: Dockerfile - structured & cleaner build process
pull/2395/head
Nicolas Hennion 2023-05-13 09:23:02 +02:00 committed by GitHub
commit b43eecf83e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 188 additions and 192 deletions

View File

@ -1,2 +1,16 @@
.dockerignore
.git
# Ignore everything
*
# Include only code files
!/glances/**/*.py
# Include WebUI files (remove when webui moved to seperate package)
!/glances/outputs/static
# Include Requirements files
!/requirements.txt
!/webui-requirements.txt
!/optional-requirements.txt
# Include Config file
!/docker-compose/glances.conf

View File

@ -11,11 +11,27 @@
ARG IMAGE_VERSION=3.18.0
ARG PYTHON_VERSION=3.11
FROM alpine:${IMAGE_VERSION} as build
ARG PYTHON_VERSION
##############################################################################
# Base layer to be used for building dependencies and the release images
FROM alpine:${IMAGE_VERSION} as base
RUN apk add --no-cache \
python3 \
curl \
lm-sensors \
wireless-tools \
smartmontools \
iputils \
tzdata
##############################################################################
# BUILD Stages
##############################################################################
# BUILD: Base image shared by all build images
FROM base as build
ARG PYTHON_VERSION
RUN apk add --no-cache \
python3-dev \
py3-pip \
py3-wheel \
@ -24,124 +40,78 @@ RUN apk add --no-cache \
build-base \
libzmq \
zeromq-dev \
curl \
lm-sensors \
wireless-tools \
smartmontools \
iputils \
tzdata \
# Required for 'cryptography' dependency of optional requirement 'cassandra-driver' \
# Refer: https://cryptography.io/en/latest/installation/#alpine \
# `git` required to clone cargo crates (dependencies)
gcc libffi-dev openssl-dev cargo pkgconfig git
git \
gcc \
cargo \
pkgconfig \
libffi-dev \
openssl-dev
RUN python${PYTHON_VERSION} -m venv --system-site-packages --without-pip venv
COPY requirements.txt webui-requirements.txt optional-requirements.txt ./
##############################################################################
# Install the dependencies beforehand to make them cacheable
# BUILD: Install the minimal image deps
FROM build as buildMinimal
FROM build as buildRequirements
ARG PYTHON_VERSION
COPY requirements.txt .
RUN pip3 install --no-cache-dir --user -r requirements.txt
# Minimal means no webui, but it break what is done previously (see #2155)
# So install the webui requirements...
COPY webui-requirements.txt .
RUN pip3 install --no-cache-dir --user -r webui-requirements.txt
# As minimal image we want to monitor others docker containers
RUN pip3 install --no-cache-dir --user docker
# Force install otherwise it could be cached without rerun
ARG CHANGING_ARG
RUN pip3 install --no-cache-dir --user glances
RUN /venv/bin/python3 -m pip install \
docker \
python-dateutil \
#-r requirements.txt \
-r webui-requirements.txt
##############################################################################
FROM build as buildOptionalRequirements
ARG PYTHON_VERSION
# BUILD: Install all the deps
FROM build as buildFull
# Required for optional dependency cassandra-driver
ENV CASS_DRIVER_NO_CYTHON=1
ARG CASS_DRIVER_NO_CYTHON=1
# See issue 2368
ENV CARGO_NET_GIT_FETCH_WITH_CLI=true
ARG CARGO_NET_GIT_FETCH_WITH_CLI=true
COPY requirements.txt .
COPY optional-requirements.txt .
RUN pip3 install --no-cache-dir --user -r optional-requirements.txt
RUN /venv/bin/python3 -m pip install \
#-r requirements.txt \
-r optional-requirements.txt
##############################################################################
# full image
# RELEASE Stages
##############################################################################
# Base image shared by all releases
FROM base as release
FROM build as full
ARG PYTHON_VERSION
COPY --from=buildRequirements /root/.local/bin /usr/local/bin/
COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/site-packages/
COPY --from=buildOptionalRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/site-packages/
# Copy source code and config file
COPY ./docker-compose/glances.conf /etc/glances.conf
COPY /glances /app/glances
# EXPOSE PORT (XMLRPC / WebUI)
EXPOSE 61209 61208
# Define default command.
WORKDIR /glances
CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT
WORKDIR /app
CMD /venv/bin/python3 -m glances -C /etc/glances.conf $GLANCES_OPT
##############################################################################
# minimal image
##############################################################################
################################################################################
# RELEASE: minimal
FROM release as minimal
# Create running images without any building dependency
FROM alpine:${IMAGE_VERSION} as minimal
ARG PYTHON_VERSION
COPY --from=buildMinimal /venv /venv
RUN apk add --no-cache \
python3 \
py3-packaging \
py3-dateutil \
py3-requests \
curl \
lm-sensors \
wireless-tools \
smartmontools \
iputils \
tzdata
################################################################################
# RELEASE: full
FROM release as full
COPY --from=buildRequirements /root/.local/bin /usr/local/bin/
COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/site-packages/
COPY ./docker-compose/glances.conf /etc/glances.conf
RUN apk add --no-cache libzmq
# EXPOSE PORT (XMLRPC / WebUI)
EXPOSE 61209 61208
# Define default command.
WORKDIR /glances
CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT
##############################################################################
# dev image
##############################################################################
COPY --from=buildFull /venv /venv
################################################################################
# RELEASE: dev - to be compatible with CI
FROM full as dev
ARG PYTHON_VERSION
COPY --from=buildRequirements /root/.local/bin /usr/local/bin/
COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/site-packages/
COPY --from=buildOptionalRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/site-packages/
COPY ./docker-compose/glances.conf /etc/glances.conf
# Copy the current Glances source code
COPY . /glances
# EXPOSE PORT (XMLRPC / WebUI)
EXPOSE 61209 61208
# Forward access and error logs to Docker's log collector
RUN ln -sf /dev/stdout /tmp/glances-root.log \
&& ln -sf /dev/stderr /var/log/error.log
# Define default command.
WORKDIR /glances
CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT
&& ln -sf /dev/stderr /var/log/error.log \

View File

@ -8,143 +8,107 @@
# Ex: Python 3.10 for Ubuntu 22.04
# Note: ENV is for future running containers. ARG for building your Docker image.
# Image from CUDA https://hub.docker.com/r/nvidia/cuda/tags
ARG IMAGE_VERSION=12.1.1-base-ubuntu22.04
ARG PYTHON_VERSION=3.10
ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/
FROM nvidia/cuda:${IMAGE_VERSION} as build
ARG IMAGE_VERSION=23.04
ARG PYTHON_VERSION=3.11
##############################################################################
# Base layer to be used for building dependencies and the release images
FROM ubuntu:${IMAGE_VERSION} as base
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
python3 \
curl \
lm-sensors \
wireless-tools \
smartmontools \
net-tools \
tzdata \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
##############################################################################
# BUILD Stages
##############################################################################
# BUILD: Base image shared by all build images
FROM base as build
ARG PYTHON_VERSION
ARG DEBIAN_FRONTEND=noninteractive
# Install build-time dependencies
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
python3-dev \
python3-venv \
python3-pip \
python3-wheel \
libzmq5 \
musl-dev \
build-essential \
libzmq5 \
curl \
lm-sensors \
wireless-tools \
smartmontools \
net-tools \
tzdata \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
##############################################################################
# Install the dependencies beforehand to make them cacheable
RUN python${PYTHON_VERSION} -m venv venv
FROM build as buildRequirements
ARG PYTHON_VERSION
ARG PIP_MIRROR
ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/
COPY requirements.txt .
RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user -r requirements.txt -i ${PIP_MIRROR}
# Minimal means no webui, but it break what is done previously (see #2155)
# So install the webui requirements...
COPY webui-requirements.txt .
RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user -r webui-requirements.txt -i ${PIP_MIRROR}
# As minimal image we want to monitor others docker containers
RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user docker -i ${PIP_MIRROR}
# Force install otherwise it could be cached without rerun
ARG CHANGING_ARG
RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user glances -i ${PIP_MIRROR}
COPY requirements.txt webui-requirements.txt optional-requirements.txt ./
##############################################################################
# BUILD: Install the minimal image deps
FROM build as buildMinimal
FROM build as buildOptionalRequirements
ARG PYTHON_VERSION
ARG PIP_MIRROR
COPY requirements.txt .
COPY optional-requirements.txt .
RUN CASS_DRIVER_NO_CYTHON=1 pip3 install --no-cache-dir --user -r optional-requirements.txt -i ${PIP_MIRROR}
RUN /venv/bin/python3 -m pip install \
docker \
python-dateutil \
#-r requirements.txt \
-r webui-requirements.txt
##############################################################################
# full image
# BUILD: Install all the deps
FROM build as buildFull
RUN /venv/bin/python3 -m pip install \
#-r requirements.txt \
-r optional-requirements.txt
##############################################################################
# RELEASE Stages
##############################################################################
# Base image shared by all releases
FROM base as release
FROM build as full
ARG PYTHON_VERSION
COPY --from=buildRequirements /root/.local/bin /root/.local/bin/
COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/
COPY --from=buildOptionalRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/
# Copy Glances source code and config file
COPY ./docker-compose/glances.conf /etc/glances.conf
COPY /glances /app/glances
# EXPOSE PORT (XMLRPC / WebUI)
EXPOSE 61209 61208
# Define default command.
WORKDIR /glances
CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT
WORKDIR /app
CMD /venv/bin/python3 -m glances -C /etc/glances.conf $GLANCES_OPT
##############################################################################
# minimal image
##############################################################################
################################################################################
# RELEASE: minimal
FROM release as minimal
# Create running images without any building dependency
FROM nvidia/cuda:${IMAGE_VERSION} as minimal
ARG PYTHON_VERSION
COPY --from=buildMinimal /venv /venv
ARG DEBIAN_FRONTEND=noninteractive
################################################################################
# RELEASE: full
FROM release as full
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
python3 \
python3-packaging \
python3-dateutil \
python3-requests \
curl \
lm-sensors \
wireless-tools \
smartmontools \
net-tools \
tzdata \
&& apt-get install -y --no-install-recommends libzmq5 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
COPY --from=buildRequirements /root/.local/bin /root/.local/bin/
COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/
COPY ./docker-compose/glances.conf /etc/glances.conf
# EXPOSE PORT (XMLRPC / WebUI)
EXPOSE 61209 61208
# Define default command.
WORKDIR /glances
CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT
##############################################################################
# dev image
##############################################################################
COPY --from=buildFull /venv /venv
################################################################################
# RELEASE: dev - to be compatible with CI
FROM full as dev
ARG PYTHON_VERSION
COPY --from=buildRequirements /root/.local/bin /root/.local/bin/
COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/
COPY --from=buildOptionalRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/
COPY ./docker-compose/glances.conf /etc/glances.conf
# Copy the current Glances source code
COPY . /glances
# EXPOSE PORT (XMLRPC / WebUI)
EXPOSE 61209 61208
# Forward access and error logs to Docker's log collector
RUN ln -sf /dev/stdout /tmp/glances-root.log \
&& ln -sf /dev/stderr /var/log/error.log
# Define default command.
WORKDIR /glances
CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT
&& ln -sf /dev/stderr /var/log/error.log

View File

@ -166,5 +166,53 @@ You can add a ``[passwords]`` block to the Glances configuration file as mention
localhost=mylocalhostpassword
default=mydefaultpassword
Using GPU Plugin with Docker (Only Nvidia GPUs)
------------------------------------------------------------------
Complete the steps mentioned in the `docker docs <https://docs.docker.com/config/containers/resource_constraints/#gpu>`_
to make the GPU accessible by the docker engine.
With `docker run`
^^^^^^^^^^^^^^^^^
Include the `--gpus` flag with the `docker run` command.
**Note:** Make sure the `--gpus` is present before the image name in the command, otherwise it won't work.
.. code-block:: ini
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --gpus --pid host --network host -it docker.io/nicolargo/glances:latest-full
..
With `docker-compose`
^^^^^^^^^^^^^^^^^^^^^
Include the `deploy` section in compose file as specified below in the example service definition.
.. code-block:: ini
version: '3'
services:
monitoring:
image: nicolargo/glances:latest-full
pid: host
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- "GLANCES_OPT=-w"
# For nvidia GPUs
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
..
Reference: https://docs.docker.com/compose/gpu-support/
.. _DockerHub: https://hub.docker.com/r/nicolargo/glances/tags