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

Cha*_*tra 9 containers image base docker

我正在尝试按照官方 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)"
Run Code Online (Sandbox Code Playgroud)

Docker 文件:

    FROM scratch
    COPY hello /
    CMD ["/hello"]
Run Code Online (Sandbox Code Playgroud)

你好ç

    #include <stdio.h>
        int main()
        {
           // printf() displays the string inside quotation
           printf("Hello, World!");
           return 0;
        }
Run Code Online (Sandbox Code Playgroud)

我能够编译 C 程序并在本地执行

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

    # docker run -i hello
        standard_init_linux.go:211: exec user process caused "no such file or directory" 
    #
Run Code Online (Sandbox Code Playgroud)

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

atl*_*ine 7

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

$ 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)
Run Code Online (Sandbox Code Playgroud)

scratch是非常基本的,没有太多so的二进制到动态链接。因此,您需要构建一个静态链接二进制文件,例如:

$ gcc -o hello -static hello.c
$ ldd hello
    not a dynamic executable
Run Code Online (Sandbox Code Playgroud)

然后,它将像下面一样工作:

$ 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!
Run Code Online (Sandbox Code Playgroud)

而且,如果您不使用系统中scratch具有更多图像的图像.so,则无需构建静态二进制文件。

  • 其实我不太明白为什么你一定要用`scratch`,里面有很多东西没有,比如`sh`、`bash`,如果你坚持的话可以看看[这个](https: //github.com/tianon/docker-bash/blob/fba9ecf51cac8e334263a377fe0c5c0e4de74265/5.0/Dockerfile),它告诉你如何在没有bash的镜像中安装bash。不过,我建议您使用 `alpine`、`ubuntu` 或其他作为基础镜像。 (2认同)
  • `scratch` 没有 `sh`,没有 `bash`,如果你真的想要的话,那对你来说会很痛苦,你必须一一安装你需要的所有东西...... (2认同)
  • `scratch` 里_什么都没有_。甚至没有“/bin”或“/lib”目录。 (2认同)