0

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.

AlexM
  • 1,020
  • 2
  • 17
  • 35
WitnessTruth
  • 539
  • 2
  • 9
  • 27
  • If you’re having libc compatibility issues, the easiest workaround is to just not use the Alpine base image. It’s the one big obvious downside to it. (Everything you show here really should be in the `Dockerfile` too, but that’s secondary to your question.) – David Maze Nov 13 '19 at 14:55
  • @DavidMaze yes yes, I would use the non-alpine image if my manager didn't insist to use it :/. "It has to be the alpine version due to the final image size" – WitnessTruth Nov 13 '19 at 16:02
  • Please post contents of `/msa-app/requirements.txt` so we can re-create. – v25 Nov 13 '19 at 22:22

2 Answers2

1

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" ]
Umar Kayondo
  • 405
  • 4
  • 9
1

SAP NWRFC SDK is not supported on Alpine platform and RFC SDK based connectors are not supported on Alpine. The same issue as with node-rfc: https://github.com/SAP/node-rfc/issues/148

bsrdjan
  • 436
  • 3
  • 10