pythondockeralpine-linuxpyrfc

Docker image python-alpine fails when using lib


I have the following Dockerfile:

FROM python:3.7-alpine

WORKDIR /msa-app/
EXPOSE 3000

ENV LD_LIBRARY_PATH="/usr/local/lib"
ENV LD_RUN_PATH="/usr/local/lib"
ENV SAPNWRFC_HOME="/usr/local/sap/nwrfcsdk"
ENV PATH="${PATH}:/usr/sap/nwrfcsdk/lib"

COPY nwrfcsdk/nwrfcsdk /usr/local/sap/nwrfcsdk
COPY nwrfcsdk/nwrfcsdk.conf /etc/ld.so.conf.d/nwrfcsdk.conf

COPY msa-app /msa-app/
RUN chmod +x /msa-app/entrypoint.sh
ENTRYPOINT /msa-app/entrypoint.sh

With the following entrypoint.sh (I put everything in entrypoint due to proxy issues inside the network that I'm using - don't blame me, it's the only way that I found to fix an issue):

#!/bin/sh

#Creates and activates virtual env
echo "*** Activating Python virtual environment"
python -m venv /msa-app/venv && source  /msa-app/venv/bin/activate

echo "*** Installing pip requirements"
pip install --upgrade pip && pip install -r /msa-app/requirements.txt

echo "*** Installing pyrfc"
pip install /msa-app/pyrfc-1.9.95-cp37-cp37m-linux_x86_64.whl

echo "*** Configuring SAPNWRFC PyRFC"
ln -s /usr/bin/python3 python
mkdir -p /etc/ld.so.conf.d/ 
mkdir -p /usr/sap/
ldconfig /usr/local/lib    

#Starts gunicorn for flask
echo "*** Starting application"
cd /msa-app && gunicorn -w 2 -b 0.0.0.0:3000 run:app

But when I try to run the container I get the following error:

ImportError: Error loading shared library libsapnwrfc.so: No such file or directory (needed by /msa-app/venv/lib/python3.7/site-packages/pyrfc/_pyrfc.cpython-37m-x86_64-linux-gnu.so)

But, this error DOESN'T happens when I use the normal non-alpine Python Docker Image. What am I doing wrong? Thank you.


Solution

  • This configuration worked for me when faced with this error.

        # For more information, please refer to https://aka.ms/vscode-docker-python
        FROM python:3-alpine3.10
        
        RUN apk add build-base
    
        RUN pip install --upgrade pip
    
        # Copy the requirements.txt to the root of the docker image
        COPY ./requirements.txt .
        
        # Keeps Python from generating .pyc files in the container
        ENV PYTHONDONTWRITEBYTECODE=1
    
        # Turns off buffering for easier container logging
        ENV PYTHONUNBUFFERED=1
    
        ENV TZ=$TIME_ZONE
    
        ENV DJANGO_PROJECT_NAME core
    
        ENV EXPOSED_CONTAINER_PORT 2092
        
        # Add header files required to install dependencies in the requirements.txt file
        RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers python3-dev musl-dev unixodbc unixodbc-dev \
            && apk add --no-cache mariadb-dev mariadb-client postgresql-libs postgresql-dev \
              && apk add jpeg-dev zlib-dev libjpeg
    
        # Install pip requirements
        RUN pip install -r requirements.txt
    
        # Install Pillow for image management
        RUN pip install Pillow
    
        # Install MS-SQL dependencies
        RUN pip install mssql-django
    
        # Install postgres engine adapter
        RUN pip install psycopg2
    
        # Install pytest for running unit-tests
        RUN pip install pytest
    
        # Delete the temporarily directory used for downloading the required image header.
        # This is done to reduce on the image size and also to remove these redundant files
        RUN apk del .tmp
    
        # This is where static files will be stored in the container. -p makes is used to create all directories that don't exist
        RUN mkdir -p /app/static
    
        # Change directory and make app as the current working directory
        WORKDIR /app
    
        COPY . /app
    
        CMD find .
    
        RUN pytest /app/tests/
        
        # Creates a non-root user with an explicit UID and adds permission to access the /app folder
       
        # For more info, please refer to https://aka.ms/vscode-docker-python-configure-containers
        
        RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
        
        USER appuser
        
    
        # Expose the container's point in order to be accessed outside the container
        EXPOSE $EXPOSED_CONTAINER_PORT:$EXPOSED_CONTAINER_PORT
        
        # Copy the entry point script to the container root directory
        COPY ./entrypoint.sh /
    
        ENTRYPOINT ["sh", "/entrypoint.sh" ]