#Fix – Azure CustomVision Exported to Docker – ImportError: cannot import name ‘soft_unicode’ from ‘markupsafe’

Hi !

In the past days I found a weird error when I export a model created with CustomVision.ai to docker. The docker image build ok, however, I found this error when I try to run the container.

āÆ docker run -p 8090:8090 squirrelscv
Traceback (most recent call last):
  File "app.py", line 7, in <module>
    from flask import Flask, request, jsonify
  File "/usr/local/lib/python3.7/site-packages/flask/__init__.py", line 14, in <module>
    from jinja2 import escape
  File "/usr/local/lib/python3.7/site-packages/jinja2/__init__.py", line 12, in <module>
    from .environment import Environment
  File "/usr/local/lib/python3.7/site-packages/jinja2/environment.py", line 25, in <module>
    from .defaults import BLOCK_END_STRING
  File "/usr/local/lib/python3.7/site-packages/jinja2/defaults.py", line 3, in <module>
    from .filters import FILTERS as DEFAULT_FILTERS  # noqa: F401
  File "/usr/local/lib/python3.7/site-packages/jinja2/filters.py", line 13, in <module>
    from markupsafe import soft_unicode
ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)
error running the docker image exported from custom vision

And hey, it took me sometime to understand and find a way to solve the error. If you want to avoid searching and reading, you only need to read this Issue

[Python] Release 4.21.0 broke multiple Google Cloud client libraries (“TypeError: Descriptors cannot not be created directly.”) #10051

And hey, the solution is to make a downgrade to some packages in the docker image definition. The following docker definition, adds the 2 necessary packages to make it work.

FROM python:3.7-slim

RUN pip install -U pip

# custom packages version to avoid custom vision error
RUN pip install markupsafe==2.0.1
RUN pip install protobuf==3.20.1

RUN pip install --no-cache-dir numpy~=1.17.5 tensorflow~=2.0.2 flask~=1.1.2 pillow~=7.2.0
RUN pip install --no-cache-dir mscviplib==2.200731.16

COPY app /app

# Expose the port
EXPOSE 8090

# Set the working directory
WORKDIR /app

# Run the flask server for the endpoints
CMD python -u app.py

And, now we can run the images !

docker image running

Happy coding!

Greetings

El Bruno

More posts in my blog ElBruno.com.


Leave a comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: