Docker: standard_init_linux.go:211: exec 用户进程导致 "no such file or directory"
Docker: standard_init_linux.go:211: exec user process caused "no such file or directory"
我正尝试按照官方 docker 网页中给出的说明创建基本图像 (https://docs.docker.com/samples/library/scratch/)
docker --version
Docker version 18.09.6, build 481bc77
OS Details:
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
Docker文件:
FROM scratch
COPY hello /
CMD ["/hello"]
hello.c
#include <stdio.h>
int main()
{
// printf() displays the string inside quotation
printf("Hello, World!");
return 0;
}
我可以编译C程序并在本地执行
我可以使用 docker 文件构建映像,但是当我尝试 运行 容器时,出现以下错误:
# docker run -i hello
standard_init_linux.go:211: exec user process caused "no such file or directory"
#
我希望容器 运行 成功并在控制台上打印 "Hello World"。
提供的大部分答案都要求更改 EOL,这不适用,因为我们已经在 Linux 而不是尝试 运行 脚本。
我猜你会收到这个错误,因为你构建了一个动态 linked 二进制文件,如下所示:
$ gcc -o hello hello.c
$ ldd hello
linux-vdso.so.1 (0x00007ffe3b1ec000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7fe1fc7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7fe25ba000)
scratch
非常基本,没有那么多 so
供您的二进制文件到动态 link。因此,您需要构建一个静态 link 二进制文件,例如:
$ gcc -o hello -static hello.c
$ ldd hello
not a dynamic executable
那么接下来就是这样了:
$ docker build -t hello .
Sending build context to Docker daemon 848.4kB
Step 1/3 : FROM scratch
--->
Step 2/3 : COPY hello /
---> 9d594b34f774
Step 3/3 : CMD ["/hello"]
---> Using cache
---> 2f1bad3099d3
Successfully built 2f1bad3099d3
Successfully tagged hello:latest
$ docker run -i hello
Hello, World!
而且,如果你不使用系统中有更多 .so
的 scratch
图像,那么你不需要构建静态二进制文件。
当脚本换行错误时,似乎会发生这种情况。根据 git 设置,您可能使用 DOS CRLF 而不是 UNIX LF。设置换行帮助我解决了这个问题。
How to change line-ending settings
我正尝试按照官方 docker 网页中给出的说明创建基本图像 (https://docs.docker.com/samples/library/scratch/)
docker --version
Docker version 18.09.6, build 481bc77
OS Details:
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
Docker文件:
FROM scratch
COPY hello /
CMD ["/hello"]
hello.c
#include <stdio.h>
int main()
{
// printf() displays the string inside quotation
printf("Hello, World!");
return 0;
}
我可以编译C程序并在本地执行
我可以使用 docker 文件构建映像,但是当我尝试 运行 容器时,出现以下错误:
# docker run -i hello
standard_init_linux.go:211: exec user process caused "no such file or directory"
#
我希望容器 运行 成功并在控制台上打印 "Hello World"。 提供的大部分答案都要求更改 EOL,这不适用,因为我们已经在 Linux 而不是尝试 运行 脚本。
我猜你会收到这个错误,因为你构建了一个动态 linked 二进制文件,如下所示:
$ gcc -o hello hello.c
$ ldd hello
linux-vdso.so.1 (0x00007ffe3b1ec000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7fe1fc7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7fe25ba000)
scratch
非常基本,没有那么多 so
供您的二进制文件到动态 link。因此,您需要构建一个静态 link 二进制文件,例如:
$ gcc -o hello -static hello.c
$ ldd hello
not a dynamic executable
那么接下来就是这样了:
$ docker build -t hello .
Sending build context to Docker daemon 848.4kB
Step 1/3 : FROM scratch
--->
Step 2/3 : COPY hello /
---> 9d594b34f774
Step 3/3 : CMD ["/hello"]
---> Using cache
---> 2f1bad3099d3
Successfully built 2f1bad3099d3
Successfully tagged hello:latest
$ docker run -i hello
Hello, World!
而且,如果你不使用系统中有更多 .so
的 scratch
图像,那么你不需要构建静态二进制文件。
当脚本换行错误时,似乎会发生这种情况。根据 git 设置,您可能使用 DOS CRLF 而不是 UNIX LF。设置换行帮助我解决了这个问题。
How to change line-ending settings