1

我对 Docker 有疑问。我制作了一个 Singularity 图像文件,它有一个运行脚本,需要一些参数才能工作。这些是该脚本的第一行:

#!/bin/sh

FS=' ' read -r -a array <<< "$@"
etc etc...

我必须将其转换为 Docker 映像,我使用了singularity2docker来做到这一点。我尝试在没有任何参数的情况下启动它(一个简单的 docker run -it containername),我可以看到 runscript 已执行,但当然,由于缺少参数,它不能正常工作。如果我尝试添加它们(docker run -it containername "-t arg1 -n arg2")我得到

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:348:启动容器进程导致“exec:\”-t\”:$PATH 中找不到可执行文件”:未知。

我有点确定这有一些愚蠢的原因,可能是由于singularity2docker 转换。我可以轻松访问用于构建 Docker 映像的沙箱,但我真的不知道该怎么做。这是我可以在里面找到的 Dockerfile。

FROM scratch
ADD . /
ENV LD_LIBRARY_PATH /.singularity.d/libs
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LABEL "org.label-schema.build-date" "Fri,_20_Apr_2018_14:42:15_+0000"
LABEL "org.label-schema.build-size" "1374MB"
LABEL "org.label-schema.schema-version" "1.0"
LABEL "org.label-schema.usage.singularity.deffile" "test1.def"
LABEL "org.label-schema.usage.singularity.deffile.bootstrap" "docker"
LABEL "org.label-schema.usage.singularity.deffile.from" "centos:7"
LABEL "org.label-schema.usage.singularity.version" "2.4.4-dist"
CMD ["/bin/bash", "run_singularity2docker.sh"]

我想尝试设置一个入口点可能会起作用,但我什至不确定是否以及如何使用该临时沙箱来做到这一点。

任何帮助将不胜感激,谢谢。

4

1 回答 1

1

切换它以使用入口点。命令值会被您在图像名称之后传递的任何内容覆盖。如果您定义一个,命令的值将附加到入口点。

首先在第一行切换脚本以使用 bash:

#!/bin/bash

FS=' ' read -r -a array <<< "$@"
etc etc...

然后更新您的 Dockerfile 以使用入口点:

FROM scratch
ADD . /
ENV LD_LIBRARY_PATH /.singularity.d/libs
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LABEL "org.label-schema.build-date" "Fri,_20_Apr_2018_14:42:15_+0000"
LABEL "org.label-schema.build-size" "1374MB"
LABEL "org.label-schema.schema-version" "1.0"
LABEL "org.label-schema.usage.singularity.deffile" "test1.def"
LABEL "org.label-schema.usage.singularity.deffile.bootstrap" "docker"
LABEL "org.label-schema.usage.singularity.deffile.from" "centos:7"
LABEL "org.label-schema.usage.singularity.version" "2.4.4-dist"
ENTRYPOINT ["/bin/bash", "run_singularity2docker.sh"]

然后在不引用参数的情况下运行您的命令,将它们作为单独的参数传递给您的入口点脚本:

docker run -it containername -t arg1 -n arg2
于 2018-07-11T02:05:35.243 回答