diff options
author | Nicolas Hennion <nicolashennion@gmail.com> | 2023-05-13 09:23:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-13 09:23:02 +0200 |
commit | b43eecf83e99d10be2f470847ee2d209437cb0ce (patch) | |
tree | 39ce0d96695c93597189547edf58541787d1df86 | |
parent | 14d26f279165b7ad968b484a6010cdffba3898e8 (diff) | |
parent | f439b1a5636051c254da49295989702f6e4f6b3f (diff) |
Merge pull request #2386 from nicolargo/improve-docker-images
chg: Dockerfile - structured & cleaner build process
-rw-r--r-- | .dockerignore | 18 | ||||
-rw-r--r-- | docker-files/alpine.Dockerfile | 150 | ||||
-rw-r--r-- | docker-files/ubuntu.Dockerfile | 148 | ||||
-rw-r--r-- | docs/docker.rst | 48 |
4 files changed, 180 insertions, 184 deletions
diff --git a/.dockerignore b/.dockerignore index c2e5dbd2..de510139 100644 --- a/.dockerignore +++ b/.dockerignore @@ -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 diff --git a/docker-files/alpine.Dockerfile b/docker-files/alpine.Dockerfile index e32f0cb3..aa551ce9 100644 --- a/docker-files/alpine.Dockerfile +++ b/docker-files/alpine.Dockerfile @@ -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 - -############################################################################## -# Install the dependencies beforehand to make them cacheable + git \ + gcc \ + cargo \ + pkgconfig \ + libffi-dev \ + openssl-dev -FROM build as buildRequirements -ARG PYTHON_VERSION - -COPY requirements.txt . -RUN pip3 install --no-cache-dir --user -r requirements.txt +RUN python${PYTHON_VERSION} -m venv --system-site-packages --without-pip venv -# 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 +COPY requirements.txt webui-requirements.txt optional-requirements.txt ./ -# As minimal image we want to monitor others docker containers -RUN pip3 install --no-cache-dir --user docker +############################################################################## +# BUILD: Install the minimal image deps +FROM build as buildMinimal -# 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 -############################################################################## - -# Create running images without any building dependency -FROM alpine:${IMAGE_VERSION} as minimal -ARG PYTHON_VERSION - -RUN apk add --no-cache \ - python3 \ - py3-packaging \ - py3-dateutil \ - py3-requests \ - curl \ - lm-sensors \ - wireless-tools \ - smartmontools \ - iputils \ - tzdata +################################################################################ +# RELEASE: minimal +FROM release as minimal -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 +COPY --from=buildMinimal /venv /venv -# EXPOSE PORT (XMLRPC / WebUI) -EXPOSE 61209 61208 +################################################################################ +# RELEASE: full +FROM release as full -# Define default command. -WORKDIR /glances -CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT +RUN apk add --no-cache libzmq -############################################################################## -# 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 \ diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile index b929bd74..b5c148bc 100644 --- a/docker-files/ubuntu.Dockerfile +++ b/docker-files/ubuntu.Dockerfile @@ -8,23 +8,17 @@ # 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 \ - python3-dev \ - python3-pip \ - python3-wheel \ - musl-dev \ - build-essential \ - libzmq5 \ curl \ lm-sensors \ wireless-tools \ @@ -35,116 +29,86 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* ############################################################################## -# Install the dependencies beforehand to make them cacheable - -FROM build as buildRequirements +# BUILD Stages +############################################################################## +# BUILD: Base image shared by all build images +FROM base as build ARG PYTHON_VERSION -ARG PIP_MIRROR +ARG DEBIAN_FRONTEND=noninteractive -ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/ +# 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 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* -COPY requirements.txt . -RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user -r requirements.txt -i ${PIP_MIRROR} +RUN python${PYTHON_VERSION} -m venv venv -# 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} +COPY requirements.txt webui-requirements.txt optional-requirements.txt ./ -# 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} +############################################################################## +# BUILD: Install the minimal image deps +FROM build as buildMinimal -# 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} +RUN /venv/bin/python3 -m pip install \ + docker \ + python-dateutil \ + #-r requirements.txt \ + -r webui-requirements.txt ############################################################################## +# BUILD: Install all the deps +FROM build as buildFull -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 \ + #-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 /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
\ No newline at end of file diff --git a/docs/docker.rst b/docs/docker.rst index 7cd57875..da7ee389 100644 --- a/docs/docker.rst +++ b/docs/docker.rst @@ -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 |