Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 脚本在同事的设备上运行得很好,但给了我';无效的跨设备链接';_Shell_Docker Desktop - Fatal编程技术网

Shell 脚本在同事的设备上运行得很好,但给了我';无效的跨设备链接';

Shell 脚本在同事的设备上运行得很好,但给了我';无效的跨设备链接';,shell,docker-desktop,Shell,Docker Desktop,我的脚本在同事的设备上运行得很好(MacOSX,Docker Desktop与我相同),但每次都会出现相同的错误,并且它不会移动或只移动deps目录中的一半库: 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 S

我的脚本在同事的设备上运行得很好(MacOSX,Docker Desktop与我相同),但每次都会出现相同的错误,并且它不会移动或只移动
deps
目录中的一半库:

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 docker映像创建lambda层(基本上是一个包含库的zip),并删除不需要的库,将它们放入另一个文件夹
deps

上述代码将使用公共Docker映像lambci/lambda,并将安装在空的
python
目录中,这些库来自一个名为“远大期望”的python包,它有助于测试数据管道(在requirements.txt中指定,并且是
远大期望==0.12.7


我被这个问题困扰了一段时间,还没有找到解决办法。

刚刚遇到了这个问题

/tmp和/foo是不同的设备-/tmp在docker操作系统中,/foo映射到本地操作系统

pip似乎在使用shutil.rename()将构建包从tmp移动到最终输出位置(/foo)。这会失败,因为它们是不同的设备。理想情况下,pip将使用shutil.move()代替,它将处理跨设备移动

作为一种解决方法,您可以通过在调用PIP命令之前设置TMPDIR来更改PIP使用的临时文件夹。i、 e.
export TMPDIR=/foo/tmp
,然后在docker映像中调用pip。因此,整个命令可能类似于

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}"
(多个命令soln取自-打开以获得更好的建议!)


这可能会更慢,因为它使用本地操作系统来处理临时文件,但它避免了尝试跨设备从临时文件夹“重命名”到最终输出文件夹。

刚刚遇到了这个问题

/tmp和/foo是不同的设备-/tmp在docker操作系统中,/foo映射到本地操作系统

pip似乎在使用shutil.rename()将构建包从tmp移动到最终输出位置(/foo)。这会失败,因为它们是不同的设备。理想情况下,pip将使用shutil.move()代替,它将处理跨设备移动

作为一种解决方法,您可以通过在调用PIP命令之前设置TMPDIR来更改PIP使用的临时文件夹。i、 e.
export TMPDIR=/foo/tmp
,然后在docker映像中调用pip。因此,整个命令可能类似于

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}"
(多个命令soln取自-打开以获得更好的建议!)


这可能会更慢,因为它正在使用本地操作系统处理临时文件,但它避免了尝试跨设备从临时文件夹“重命名”到最终输出文件夹。

似乎您可能遇到了一些硬链接问题:您是否碰巧遇到了错误中提到的任何文件夹?忘记了
-s
标志吗?我没有链接任何文件夹如果源和目标位于不同的文件系统上,这是您尝试使用
重命名(2)
移动它时会遇到的错误,但是在这种情况下,AFAIK
mv(1)
应该返回到复制然后删除。您的同事是否在同一个文件系统上有
/tmp
/foo
?我已经看到,如果我在/Users/random\u name中创建一个新目录,它可以正常工作。但是如果我在同一个目录中多次运行脚本,它将不再工作,或者如果我在Users/random\u name/Desktop中创建一个新目录,它将不工作。并且目录具有访问权限。您可能遇到了一些硬链接问题:您是否碰巧遇到了错误中提到的任何文件夹?忘记了
-s
标志吗?我没有链接任何文件夹如果源和目标位于不同的文件系统上,这是您尝试使用
重命名(2)
移动它时会遇到的错误,但是在这种情况下,AFAIK
mv(1)
应该返回到复制然后删除。您的同事是否在同一个文件系统上有
/tmp
/foo
?我已经看到,如果我在/Users/random\u name中创建一个新目录,它可以正常工作。但是如果我在同一个目录中多次运行脚本,它将不再工作,或者如果我在Users/random\u name/Desktop中创建一个新目录,它将不工作。并且目录具有访问权限