Docker:standard_init_linux.go:211:exec用户进程导致“没有这样的文件或目录”

时间:2019-07-01 08:31:06

标签: image docker containers base

我正在尝试按照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)"

DockerFile:

    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程序并在本地执行

我能够使用dockerfile构建映像,但是当我尝试运行容器时,出现以下错误:

    # docker run -i hello
        standard_init_linux.go:211: exec user process caused "no such file or directory" 
    #

我希望容器成功运行并在控制台上打印“ Hello World”。 提供的大多数答案都要求更改EOL,这是不适用的,因为我们已经在Linux上并且没有尝试运行脚本。

1 个答案:

答案 0 :(得分:1)

我猜您会收到此错误,因为您构建了一个动态链接的二进制文件,如下所示:

$ 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。因此,您需要构建一个静态链接二进制文件,例如:

$ 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!

而且,如果您不使用系统中有更多scratch的{​​{1}}映像,则无需构建静态二进制文件。