我的脚本在同事设备(MacOSX与Desktop与我一样)上运行得很好,但是每次都给我相同的错误和它不移动的,或者只有一半是目录中的库。
OSError: [Errno 18] Invalid cross-device link: '/tmp/pip-target-dzwe_2kc/lib/python/numpy' ->
'/foo/python/numpy'我的剧本:
#!/bin/bash
export PKG_DIR='python'
export SIDE_DEPS_DIR='deps'
rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}
rm -rf ${SIDE_DEPS_DIR} && mkdir -p ${SIDE_DEPS_DIR}
docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.8 \
pip3 install -r requirements.txt -t ${PKG_DIR}
# move stuff to deps
find /${PKG_DIR} -maxdepth 1 -type d \
\( -name "pandas*" -o -name "numpy*" -o -name "numpy.libs*" -o -name "scipy*" -o -name "scipy.libs*" \) -exec mv '{}' ${SIDE_DEPS_DIR} \;
# zip side dependencies
zip -r ge_deps.zip deps
# zip layer
zip -r layers-python38-great-expectations.zip python它是一个脚本,它使用一个公共lambda映像来创建lambda层(基本上是一个包含库的zip ),并移除不必要的库,将它们放在另一个文件夹deps中。
上面的代码将使用公共Docker映像lambci / lambda,并将安装在空的python目录中,这些库来自一个称为“远大期望”的python包,它有助于测试数据管道( requirements.txt中指定,是great-expectations==0.12.7)。
我已经被这个问题困了一段时间了,还没有找到解决办法。
发布于 2021-01-11 15:14:18
刚刚出了这个问题。
/tmp和/foo是不同的设备-- /tmp在坞操作系统中,/foo映射到本地操作系统。
pip似乎正在使用shutil.rename()将构建的包从tmp移动到最终的输出位置(/foo)。这是失败的,因为它们是不同的设备。理想情况下,pip将使用shutil.move()代替,这将处理跨设备移动。
作为解决办法,您可以在调用PIP命令之前通过设置TMPDIR来更改pip使用的临时文件夹。即在码头映像中调用pip之前的export TMPDIR=/foo/tmp。所以,整个命令可能类似于
docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.8 \
/bin/bash -c "export TMPDIR=/foo/tmp && pip3 install -r requirements.txt -t ${PKG_DIR}"(从https://www.edureka.co/community/10736/how-to-run-multiple-commands-in-docker-at-once获取的多个命令soln --开放给更好的建议!)
这可能会慢一些,因为它使用本地操作系统处理临时文件,但它避免了从临时文件夹到最终输出文件夹的设备之间的“重命名”尝试。
https://stackoverflow.com/questions/64794517
复制相似问题