Невозможно прочитать файл внутри образа Docker с помощью методов std :: fs - PullRequest
0 голосов
/ 04 июня 2018

У меня есть простое приложение 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 возвращает правильный путь к файлу, но когда я добавляю файлы в образ Dockerпохож на ржавый мусульманин-строитель , я получаю ошибки:

канонизированный pathErr (Os {код: 2, вид: NotFound, сообщение: "Нет такого файла или каталога")})

Существует ли путь false

Мой 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 голосов
/ 04 июня 2018

Я нашел решение этой проблемы на основе larsks комментария выше :

Также: вы, кажется, используете относительные пути в вашем коде.Вы уверены, что эти относительные пути будут правильными в вашем контейнере?У вас нет директив 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...