代码之家  ›  专栏  ›  技术社区  ›  manonthemat

标准初始化_linux.go:219:exec user process caused:没有这样的文件或目录

  •  0
  • manonthemat  · 技术社区  · 4 年前

    我正在尝试将我的rust服务器从Heroku移动到googlecloud或AWS。尽管我喜欢拥有一个 git push 只需指定一个buildpack就可以构建并部署到Heroku,这项服务对我来说并不划算。

    我认为googlecloudrun和AWS弹性Beanstalk是潜在的替代品。

    首先,我需要用一个静态二进制文件构建一个docker映像。

    FROM rust AS build
    WORKDIR /usr/src
    RUN rustup target add x86_64-unknown-linux-musl
    RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev musl-tools brotli
    RUN USER=root cargo new loxe-api
    WORKDIR /usr/src/loxe-api
    COPY Cargo.toml Cargo.lock ./
    COPY data ./data
    COPY migrations ./migrations
    ENV RUSTFLAGS="-C target-feature=+crt-static" # this should be set by the target, but just to be sure
    RUN cargo build --release
    COPY src ./src
    ENV PKG_CONFIG_ALLOW_CROSS=1
    ENV OPENSSL_INCLUDE_DIR="/usr/include/openssl"
    RUN cargo install --target x86_64-unknown-linux-musl --path .
    
    FROM scratch
    COPY --from=build /usr/local/cargo/bin/loxe-api .
    COPY data ./data
    COPY migrations ./migrations
    USER 1000
    CMD ["./loxe-api"]
    

    映像生成时没有错误,但如果通过docker run运行它,则会出现以下错误:

    标准初始化_linux.go:219:exec user process caused:没有此类文件或 目录

    通过用rust替换最后一步的基本映像,我检查了二进制文件和其他文件是否确实在映像中。他们是,我可以通过ls看到他们,但我也不能执行 loxe-api 当进入外壳时。

    dockerd记录:

    INFO[2020-07-05T13:04:42.368119033-07:00] shim containerd-shim started                  address=/containerd-shim/bf85e63468a9c1b3b9fe418b5a186673f0609bfff20c4832789ae87433e82473.sock debug=false pid=27032
    INFO[2020-07-05T13:04:42.913438974-07:00] shim reaped                                   id=8cadeee800649ceca8a52d9a75cc9071b923d01a5d2a37497bf8b9a6e719267a
    INFO[2020-07-05T13:04:42.925442900-07:00] ignoring event                                module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
    

    下面是货物.toml:

    [dependencies]
    actix = "0.9"
    actix-cors = "0.2"
    actix-identity = "0.2"
    actix-multipart = "0.2"
    actix-rt = "1.0"
    actix-web = "2.0"
    argonautica = "0.2"
    brotli = "3.3"
    bytes = { version = "0.5", features = ["serde"]  }
    chrono = { version = "0.4", features = ["serde"]  }
    derive_more = "0.99"
    diesel = { version = "1.4", features = ["postgres", "uuidv07", "r2d2", "chrono", "serde_json"]  }
    diesel_migrations = "1.4"
    dotenv = "0.15"
    env_logger = "0.7"
    futures = "0.3"
    indexmap = { version = "1.3", features = ["serde-1"] }
    lazy_static = "1.4"
    log = "0.4"
    openssl = { version = "0.10", features = ["vendored"] }
    openssl-probe = "0.1.2"
    percent-encoding = "2.1"
    r2d2 = "0.8"
    rand = "0.7"
    redis = "0.15"
    rusoto_core = { version = "0.44" }
    rusoto_s3 = { version = "0.44" }
    sanitize-filename = "0.2"
    sendgrid = { version = "0.10", features = ["rustls"] }
    serde = { version = "1.0", features = ["derive"]  }
    serde_json = "1.0"
    stripe-rust = "0.12"
    uuid = { version = "0.8", features = ["serde", "v4"]  }
    wana_kana = "2.0"
    

    $ ldd /loxe-api
            linux-vdso.so.1 (0x00007ffcc219d000)
            libpq.so.5 => /usr/lib/x86_64-linux-gnu/libpq.so.5 (0x00007f2d3792d000)
            libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f2d3789b000)
            libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f2d375b2000)
            libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f2d37565000)
            libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007f2d37511000)
            libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2d374f0000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d3732d000)
            libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2d37328000)
            libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f2d37248000)
            libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f2d37214000)
            libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f2d3720e000)
            libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f2d371ff000)
            libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f2d371f6000)
            libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f2d371dc000)
            liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007f2d371cb000)
            libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f2d371ae000)
            libgnutls.so.30 => /usr/lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f2d37002000)
            /lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f2d37983000)
            libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f2d36ed1000)
            libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f2d36eb2000)
            libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f2d36d2e000)
            libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f2d36b1b000)
            libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007f2d36ae3000)
            libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007f2d36aaa000)
            libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f2d36a25000)
            libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f2d36a1b000)
    

    我还尝试从我的主机系统构建和执行。 我跑了 cargo run --target x86_64-unknown-linux-musl --release

    target/x86_64-unknown-linux-musl/release/loxe-api (从未执行)

    我检查过二进制via的存在 du -h target/x86_64-unknown-linux-musl/release/loxe-api :

    35M     target/x86_64-unknown-linux-musl/release/loxe-api
    

    使用x86_64-unknown-linux-musl目标构建并运行一个新的cargo default项目。我想,libclang、brotli或一些argonautica库可能会导致这种情况不起作用。


    下面是一个简化的Dockerfile,可以得到相同的结果。

    FROM rust AS build
    WORKDIR /usr/src
    
    RUN rustup target add x86_64-unknown-linux-musl
    RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev musl-tools brotli
    
    RUN USER=root cargo new loxe-api
    WORKDIR /usr/src/loxe-api
    COPY Cargo.toml Cargo.lock ./
    COPY data ./data
    COPY migrations ./migrations
    COPY src ./src
    ENV PKG_CONFIG_ALLOW_CROSS=1
    ENV OPENSSL_INCLUDE_DIR="/usr/include/openssl"
    ENV RUSTFLAGS="-C target-feature=+crt-static"
    RUN cargo install --target x86_64-unknown-linux-musl --path .
    
    FROM debian
    COPY --from=build /usr/local/cargo/bin/loxe-api .
    COPY .env ./.env
    COPY data ./data
    COPY migrations ./migrations
    USER 1000
    CMD ["./loxe-api"]
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   manonthemat    4 年前

    虽然仍然有点臃肿,但至少现在我的服务运行在GCP云上。这就是我创建241 mb docker映像的方式,我可以将其发送到不同的服务。

    首先,我用rust-argon2替换了aronautica板条箱。

    FROM rust AS build
    WORKDIR /usr/src
    RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev brotli
    RUN USER=root cargo new loxe-api
    WORKDIR /usr/src/loxe-api
    COPY Cargo.toml Cargo.lock ./
    COPY data ./data
    COPY migrations ./migrations
    RUN cargo build --release
    # Copy the source and build the application.
    COPY src ./src
    ENV PKG_CONFIG_ALLOW_CROSS=1
    ENV OPENSSL_INCLUDE_DIR="/usr/include/openssl"
    RUN cargo install --path .
    
    FROM debian:buster-slim
    COPY --from=build /usr/local/cargo/bin/loxe-api .
    # standard env
    COPY .env ./.env
    COPY data ./data
    COPY migrations ./migrations
    RUN apt-get update && apt-get install -y libssl-dev pkg-config libpq-dev brotli
    CMD ["/loxe-api"]
    

    基本上就是这样。 生成的Docker图像现在在googlecloudrun上运行没有问题。

        2
  •  1
  •   Old Pro    4 年前

    我无法按原样构建您的简化Dockerfile,因为我没有您在COPY语句中引用的源文件,因此出现“COPY failed”错误。你说“用x86_64-unknown-linux-musl目标构建并运行一个新的cargo默认项目”实际上这个Dockerfile(删除了COPY命令的简化Dockerfile)对我来说很好:

    FROM rust AS build
    WORKDIR /usr/src
    
    RUN rustup target add x86_64-unknown-linux-musl
    RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev musl-tools brotli
    
    RUN USER=root cargo new loxe-api
    WORKDIR /usr/src/loxe-api
    
    ENV PKG_CONFIG_ALLOW_CROSS=1
    ENV OPENSSL_INCLUDE_DIR="/usr/include/openssl"
    ENV RUSTFLAGS="-C target-feature=+crt-static"
    RUN cargo install --target x86_64-unknown-linux-musl --path .
    
    FROM debian
    COPY --from=build /usr/local/cargo/bin/loxe-api .
    
    USER 1000
    CMD ["./loxe-api"]
    

    ldd 输出显示。我的ldd:

    $ ldd loxe-api 
        not a dynamic executable
    

    类似地,我可以在删除COPY命令和注释后构建更大的Dockerfile,它对我来说构建得很好。

    git 配置和重新克隆git repo可能会有所帮助。

    # update git to automatically set line ending to LF
    git config --global core.eol lf
    git config --global core.autocrlf input
    

    this helpful doc from GitHub

    如果没有帮助,请张贴一些代码,再现问题。