无法使用std :: fs方法读取Docker镜像中的文件

时间:2018-06-03 21:03:01

标签: file docker rust

我有一个简单的Rust应用程序,它读取如下的JSON文件:

fn main() {
    let config_dir = std::path::PathBuf::from("config/endpoints.json");
    println!(">>>>>>> Canonicalized path {:?}", std::fs::canonicalize(&config_dir));

    println!(">>>>>>>>read endpoint file");
    println!("Does file exist? {}", std::path::Path::new("config/endpoints.json").exists());
}

当使用cargo run运行时,应用程序会返回正确的文件路径,但是当我将文件添加到类似于the rust-musl-builder的Docker镜像中时,我会收到错误:

  

Canonicalized pathErr(Os {code:2,kind:NotFound,message:“No such file or directory”})

     

路径是否存在错误

我的Dockerfile看起来像这样

FROM ekidd/rust-musl-builder AS builder

# Add our source code.
ADD . ./

RUN sudo chown -R rust:rust /home/rust

RUN cargo build --release

FROM alpine:latest

RUN apk --no-cache add ca-certificates

EXPOSE 3001

COPY --from=builder \
    /home/rust/src/config/ \
    /usr/local/bin/config/

COPY --from=builder \
    /home/rust/src/target/x86_64-unknown-linux-musl/release/app \
    /usr/local/bin/

RUN chmod a+x /usr/local/bin/app

ENV RUST_BACKTRACE=1

CMD /usr/local/bin/app 

如何读取Docker镜像中的文件?

1 个答案:

答案 0 :(得分:0)

我根据larsks comment above找到了解决此问题的方法:

  

另外:您似乎在代码中使用相对路径。你确定你的容器中的相对路径是否正确?您没有任何WORKDIR指令,因此您的工作目录为/

问题在于没有定义WORKDIR,因此文件读取是从路径/发生的。如下所示更改Dockerfile(注意WORKDIR /usr/local/bin)解决了问题:

FROM alpine:latest

RUN apk --no-cache add ca-certificates

EXPOSE 3001

WORKDIR /usr/local/bin

COPY --from=builder \
    /home/rust/src/config/ \
    /usr/local/bin/config/

COPY --from=builder \
    /home/rust/src/target/x86_64-unknown-linux-musl/release/app \
    /usr/local/bin/

RUN chmod a+x /usr/local/bin/app

ENV RUST_BACKTRACE=1

CMD /usr/local/bin/app