In your example pip works as expected. Pillow 3.3.0 is good for requirement
Pillow >= 3.3.0. Yet, upgrade can be forced with
pip install -U.
You should time the difference in adding a custom package for buildout base default docker image compared to the pip based docker image. it should be significant in benefit of pip based image (because it only adds those new packages into virtualenv, but buildout must do much more).
Buildout exists, because Plone predates any usable version of Python virtualenvs or pip (not to mention many issues previous issues with Pyhon packaging in overall). That said, the situation now with wheel packages, virtualenv support in core (in Python 3), pip and pipenv, the situation is so much better that for some time it has been hard to justify the requirement to learn buildout for Plone development. Especially when we have not managed to keep buildout itself in par with pip (buildout is much slower and last time I checked its “offline support” is broken with wheel packages).