如何解决docker和singularity的工作目录的区别
我有一个关于 docker 和奇点的非常基本的问题。我希望能够同时使用 docker 和奇异点运行 docker 容器,但我对工作目录之间的差异感到困惑。这是一个示例:在我的 docker 容器中,我有 main.sh
和 test.sh
。
main.sh
的内容:
#!/bin/bash
echo "Executing main.sh"
./test.sh
test.sh
的内容:
#!/bin/bash
echo "Executing test.sh"
执行以下操作时:
sudo docker run -t myuser/mydocker:1.0 ./main.sh
我得到了预期的输出:
Executing main.sh
Executing test.sh
但是当执行 singularity exec -e docker://myuser/mydocker:1.0 /main.sh
我收到此错误:
Executing main.sh
/main.sh: line 4: ./test.sh: No such file or directory
为什么 test.sh
无法访问?有没有办法让它在不改变 main.sh
的内容的情况下通过奇点工作?我的奇点版本是3.6.3。
谢谢!
解决方法
这是 docker 和奇点之间的一大区别。
在 docker 中,工作目录在 Dockerfile
中使用 WORKDIR /some/path
或 -w /some/path
命令行参数设置。否则,它使用默认值 /
。
然而,奇异的是,您在主机上的主目录(或当前目录,在旧版本上)被挂载并用作容器内的工作目录。您可以使用 --pwd
标志来覆盖它。
所以给定 Dockerfile:
FROM debian:buster-slim
COPY main.sh test.sh /
使用 docker 运行:
$ docker run --rm myuser/mydocker:1.0 ./main.sh
Executing main.sh
Executing test.sh
$ docker run --rm myuser/mydocker:1.0 pwd
/
奇异点:
# note the full path of the file that isn't found
$ singularity exec -e mydocker.sif ./main.sh
FATAL: stat /home/tsnowlan/main.sh: no such file or directory
# does NOT match the WORKDIR from the Dockerfile
$ singularity exec -e mydocker.sif pwd
/home/tsnowlan
# use full path to the script
# BUT still executing from $HOME so `./test.sh` is resolves to `$HOME/test.sh`
$ singularity exec -e mydocker.sif /main.sh
Executing main.sh
/main.sh: line 4: ./test.sh: No such file or directory
# tell singularity to run from /
$ singularity exec -e --pwd / mydocker.sif ./main.sh
Executing main.sh in
Executing test.sh
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。