【问题标题】:Docker: standard_init_linux.go:211: exec user process caused "no such file or directory"Docker:standard_init_linux.go:211:exec用户进程导致“没有这样的文件或目录”
【发布时间】:2019-11-11 21:57:39
【问题描述】:

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

你好.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 上并且没有尝试运行脚本。

【问题讨论】:

    标签: image docker containers base


    【解决方案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!
    

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

    【讨论】:

    • 其实我也不是很明白你为什么要坚持使用scratch,有很多东西不在里面,e.g. shbash,如果你坚持,你可以看看this,它告诉你如何在没有 bash 的镜像中安装 bash。尽管如此,我还是建议您使用alpineubuntu 或其他作为基础镜像。
    • 它工作得很好,谢谢!现在我正在尝试使用 echo "hello world!" 运行一个简单的 .sh 脚本。有同样的错误,请建议。我试过#!/usr/local/sbin/sh echo "test:" | tee test.txt#!/bin/sh echo "test:" | tee test.txt 得到同样的错误standard_init_linux.go:211: exec user process caused "no such file or directory"
    • scratch 没有sh,没有bash,如果你真的想要那样会很痛苦,你必须把你需要的所有东西都安装好......
    • 只是想学习和尝试不同的东西,不知道 bash/sh 不是从头开始的,感谢您的提示!
    • scratch 中没有 nothing。甚至没有/bin/lib 目录。
    【解决方案2】:

    当脚本换行错误时,似乎会发生这种情况。根据 git 设置,您可能拥有 DOS CRLF 而不是 UNIX LF。设置换行帮助我解决了这个问题。

    How to change line-ending settings

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 2020-09-11
      • 2019-12-13
      • 1970-01-01
      • 2018-12-07
      • 2020-10-25
      • 1970-01-01
      • 2019-01-01
      相关资源
      最近更新 更多