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..546da463 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 + git \ + gcc \ + cargo \ + pkgconfig \ + libffi-dev \ + openssl-dev + +RUN python${PYTHON_VERSION} -m venv 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 \ 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,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 \ No newline at end of file