Linked Questions

Popular Questions

Docker-compose failed during build because one the python module in the requirement is dependent on pycairo. Is there a way around this? Here is the error message.

Failed to build pycairo

failed Pip subprocess error: WARNING: The candidate selected for download or install is a yanked version: 'pylinac' candidate (version 3.1.0 at https://files.pythonhosted.org/packages/74/08/0d997f173cac47624b0800dff04e21059ade94662e59e09c808fd1950dfc/pylinac-3.1.0-py3-none-any.whl (from https://pypi.org/simple/pylinac/) (requires-python:>=3.6)) Reason for being yanked: wrong version in package error: subprocess-exited-with-error

Building wheel for pycairo (pyproject.toml) did not run successfully. exit code: 1 [14 lines of output] running bdist_wheel running build running build_py creating build creating build/lib.linux-x86_64-cpython-38 creating build/lib.linux-x86_64-cpython-38/cairo copying cairo/init.py -> build/lib.linux-x86_64-cpython-38/cairo copying cairo/init.pyi -> build/lib.linux-x86_64-cpython-38/cairo copying cairo/py.typed -> build/lib.linux-x86_64-cpython-38/cairo warning: build_py: byte-compiling is disabled, skipping.

running build_ext 'pkg-config' not found. Command ['pkg-config', '--print-errors', '--exists', 'cairo >= 1.15.10'] [end of output]

note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for pycairo ERROR: Could not build wheels for pycairo, which is required to install pyproject.toml-based projects

CondaEnvException: Pip failed

The command '/bin/sh -c conda env create -f /tmp/environment.yml' returned a non-zero code: 1 ERROR: Service 'django' failed to build : Build failed

Here is the docker compose file:

FROM continuumio/miniconda3

ARG APP_HOME=/app
WORKDIR ${APP_HOME}

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"

# Install apt packages
RUN apt-get update && apt-get install --no-install-recommends -y \
  # dependencies for building Python packages
  build-essential \
  # Pour authentification via LDAP
  python3-dev python2.7-dev libldap2-dev libsasl2-dev ldap-utils tox lcov valgrind \
  # psycopg2 dependencies
  libpq-dev \
  # OpenCV dependencies \
  ffmpeg libsm6 libxext6 \
  # miniconda 3
  wget bash \
  # To allow python to use zlib
  zlib1g-dev \
  # To build local conda dependencies
  git \
  # For pypx
  dcmtk sudo \
  # cleaning up unused files
  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
  && rm -rf /var/lib/apt/lists/*

# Config proxy à enlever si en télétravail.
ENV http_proxy http://proxy13.regional.reg13.rtss.qc.ca:8080
ENV https_proxy http://proxy13.regional.reg13.rtss.qc.ca:8080
ENV no_proxy ${QAT_IP}

## Pour installer PyMesh2 pour Python 3.7 (Enlever quand PyMesh2 supporte python 3.7)
#ARG BRANCH="main"
#ARG NUM_CORES=2
## RUN echo "deb http://ftp.us.debian.org/debian unstable main contrib non-free" >> /etc/apt/sources.list.d/unstable.list &&\
#RUN apt-get update && apt-get install -y \
#    gcc \
#    g++ \
#    git \
#    cmake \
#    libgmp-dev \
#    libmpfr-dev \
#    libgmpxx4ldbl \
#    libboost-dev \
#    libboost-thread-dev \
#    zip unzip patchelf && \
#    apt-get clean && \
#    git clone --single-branch -b $BRANCH https://github.com/PyMesh/PyMesh.git

ADD ./requirements/environment.yml /tmp/environment.yml
ADD ./requirements/environment.production.yml /tmp/environment.production.yml
ADD ./requirements/pymesh2-0.3-cp38-cp38-linux_x86_64.whl /tmp/pymesh2-0.3-cp38-cp38-linux_x86_64.whl
RUN conda env create -f /tmp/environment.yml
RUN conda env update -n qatrain -f /tmp/environment.production.yml
RUN echo "source activate qatrain" > ~/.bashrc
ENV PATH /opt/conda/envs/qatrain/bin:$PATH

## Pour installer PyMesh2 pour Python 3.7 (suite) (Enlever quand PyMesh2 supporte python 3.7)
#ENV PYMESH_PATH /app/PyMesh
#ENV NUM_CORES $NUM_CORES
#WORKDIR $PYMESH_PATH
#RUN git submodule update --init && \
#    pip install -r $PYMESH_PATH/python/requirements.txt
#RUN sed -i '1s/^/#include <stdint.h> \n/' $PYMESH_PATH/third_party/draco/src/draco/core/hash_utils.h
#RUN sed -i '1s/^/#include <stddef.h> \n/' $PYMESH_PATH/third_party/draco/src/draco/core/hash_utils.h
#RUN sed -i '21s/^/#include <limits> \n/' $PYMESH_PATH/third_party/draco/src/draco/io/parser_utils.cc
#RUN sed -i '1s/^/SET(CMAKE_C_FLAGS " -fcommon ${CMAKE_C_FLAGS}") \n/' $PYMESH_PATH/third_party/mmg/CMakeLists.txt
#
#RUN ./setup.py bdist_wheel && \
#    rm -rf build_3.8 third_party/build && \
#    # python $PYMESH_PATH/docker/patches/patch_wheel.py dist/pymesh2*.whl && \
#    pip install dist/pymesh2*.whl && \
#    python -c "import pymesh; pymesh.test()"

##
# Apply fix to PyPx
##
RUN echo && echo && echo "Applying fix to PyPx ..."
COPY ./compose/production/django/pypx_fix .
RUN ["chmod", "+x", "./pypx_fix"]
RUN ./pypx_fix

##
# Apply fix to PyLinac for Catphan analysis
##
RUN echo && echo && echo "Applying fix to PyLinac ..."
ADD ./qatrain/blocs/ct_catphan_phantom/pylinac_mod/ct.py /opt/conda/envs/qatrain/lib/python3.8/site-packages/pylinac/ct.py
ADD ./qatrain/blocs/ct_catphan_phantom/pylinac_mod/winston_lutz.py /opt/conda/envs/qatrain/lib/python3.8/site-packages/pylinac/winston_lutz.py
ADD ./qatrain/blocs/ct_catphan_phantom/pylinac_mod/mtf.py /opt/conda/envs/qatrain/lib/python3.8/site-packages/pylinac/core/mtf.py

# All absolute dir copies ignore workdir instruction. All relative dir copies are wrt to the workdir instruction
# copy python dependency wheels from python-build-stage
#COPY --from=python-build-stage /usr/src/app/wheels  /wheels/

# use wheels to install python dependencies
#RUN pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/* \
#   && rm -rf /wheels/

COPY ./compose/production/django/entrypoint /entrypoint
RUN sed -i 's/\r$//g' /entrypoint
RUN chmod +x /entrypoint

COPY ./compose/production/django/start /start
RUN sed -i 's/\r$//g' /start
RUN chmod +x /start


COPY ./compose/production/django/celery/worker/start /start-celeryworker
RUN sed -i 's/\r$//g' /start-celeryworker
RUN chmod +x /start-celeryworker

COPY ./compose/production/django/celery/beat/start /start-celerybeat
RUN sed -i 's/\r$//g' /start-celerybeat
RUN chmod +x /start-celerybeat

COPY ./compose/production/django/celery/flower/start /start-flower
RUN sed -i 's/\r$//g' /start-flower
RUN chmod +x /start-flower

COPY ./compose/production/django/storescp/start /start-storescp
RUN sed -i 's/\r$//g' /start-storescp
RUN chmod +x /start-storescp

# copy application code to WORKDIR
COPY . ${APP_HOME}

ENTRYPOINT ["/entrypoint"]

and the environment file:

name: qatrain

channels:
- conda-forge
- anaconda
- jrkerns
- menpo
- bioconda


dependencies:
  - python=3.8
  - dcmtk=3.6.1                     # Pour service de réception fichiers DICOM
  - matplotlib=3.3.3                # Tracer graphiques
  - opencv=4.5.0                    # Frédéric Girard
  - pydicom=2.1.0                   # Travailler avec des fichiers DICOM
  - scipy=1.5.3                     # Frédéric Girard
  - numpy=1.19.4                    # Frédéric Girard
  - bullet=2.89                     # Frédéric Girard
#  - pymesh2=0.3                    # Frédéric Girard - Installé direct via dockerfile car non compilé pour python 3.8
  - peakutils=1.3.3                 # Détection de pics en traitement de signal
  - setuptools=49.6.0
  - pip
  - pip:
    - django==3.1.3                 # Framework
    - psycopg2==2.9.3               # Base de donnée PortgreSQL
    - celery==5.1.2                 # Jobber
    - django-celery-beat==2.2.1     # Jobber periodic trigger
    - redis==4.1.4                  # Gestion de l'exécution des tâches de Celery
    - djangorestframework==3.13.1   # API web
    - django-cors-headers==3.10.1   # Cross origin requests
    - django-environ==0.8.1         # Configurer l'application via variables d'environnement
    - whitenoise==5.3.0             # Simplifie la publication de fichiers statics
    - flower==1.0.0                 # GUI web pour affichage des tâches Celery en cours
    - pypx==1.0.2.0                 # Communication avec PACS
    - pyldap==3.0.0.post1           # Authentification avec LDAP
    - django-auth-ldap==2.2.0       # Authentification avec LDAP
    - requests==2.25.0              # Permet de faire des requêtes à l'API de QATrack+
    - pyquaternion==0.9.9           # Frédéric Girard
    - pyacvd==0.2.5                 # Frédéric Girard
    - pyvista==0.28.1               # Frédéric Girard
    - fuzzywuzzy==0.18.0            # Frédéric Girard
    - pycairo==1.23.0
    - pylinac==3.1.0                # Utilisation des fonctions par blocs.
    - scikit-learn==0.24.2          # Pour bloc linac_adjust_table_wl
    - scikit-image==0.20.0           # Frédéric Girard
    - ./pymesh2-0.3-cp38-cp38-linux_x86_64.whl  # Frédéric Girard
    - pynetdicom==2.0.2             # Pour l'envoi de fichiers DCM à des device dicom externe (dcm_mod)

Related Questions