python: [3-alpine] shutil.copytree fail to copy a tree with a broken symbolic link

When trying to use pre-commit hock from this repo: https://github.com/pre-commit/pre-commit-hooks

pip failed when using the shutil.copytree

I’ve narrowed it to this example, it passed on 2.7-alpine, but fails on 3.5-alpine and 3.6-alpine

FROM python:3.6-alpine

RUN apk update
RUN apk add git

RUN mkdir /bug

RUN cd /bug && ln -s /broken_path/to_nowhere broken
RUN python -c "import shutil; shutil.copytree('/bug', '/temp', symlinks=True)"

EDIT: After playing around, I’ve nailed it to this command failing

>>> os.chmod('/bug/broken', 511, follow_symlinks=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 95] Not supported: '/bug/broken'

shutil was expecting NotImplementedError

this seems related https://bugs.python.org/issue17076

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Reactions: 2
  • Comments: 17 (1 by maintainers)

Most upvoted comments

@asottile’s new patch https://github.com/python/cpython/pull/4783 seems to fix tox inside python alpine, yay!

Here’s a Dockerfile which recreates this error.

FROM python:3.6.3-alpine3.6
WORKDIR '/app'
ENTRYPOINT ["tox"]
RUN pip install tox
RUN mkdir myapp && echo 'print(1)' > myapp/__init__.py
RUN mkdir tests && echo $'def test():\n\
    assert True' > tests/test_myapp.py

RUN echo $'[tox]\n\
[testenv]\n\
commands = pytest tests\n\
deps = .' > tox.ini
RUN echo $'from setuptools import setup, find_packages\n\
setup(\n\
    name="myapp",\n\
    install_requires=["pytest"],\n\
    packages=find_packages()\n\
)' > setup.py

Running above Dockerfile confirms that we get the copytree error:

docker build -t mvce
docker run -it --rm mvce
# ...
#  File "/app/.tox/python/lib/python3.6/shutil.py", line 359, in copytree
#    raise Error(errors)
# shutil.Error: [('/app/.tox/python/lib/python3.6/imp.py',
# ...

Now if we change the FROM in above dockerfile to jacobsvante/python:3.7.0a3-alpine3.6-with-bpo-31940-lchown-fix the error doesn’t appear. Thanks @asottile!

I’ve submitted a patch to cpython: https://github.com/python/cpython/pull/4267