Я запускаю разработку, используя файл --config в своем Rust API, это примерно так
cargo run --config dev-config.toml где dev-config.toml похож на мою среду
так
[env]
APP_ENV = "development"
APP_PORT = "8181"
APP_TIMEOUT = "3" # in seconds
APP_MAX_ATTEMPTS = "50" # in attempts ( 50 request in 60 seconds )
MONGO_URI = "balblaaa"
...
Я могу создать такой образ в своем докере, чтобы скопировать файл.
# Use the official Rust image as the base image
FROM rust:latest as builder
# Set the current working directory inside the Docker image
WORKDIR /usr/src
# Copy the Cargo.toml file and your source code into the Docker image
COPY Cargo.toml .
COPY src ./src
COPY secrets ./secrets
# Copy the dev-config.toml file
COPY dev-config.toml .
# Build the application in release mode
RUN cargo build --release --config dev-config.toml
# Start a new build stage
FROM rust:latest
# Copy the binary from the builder stage to the current stage
COPY --from=builder /usr/src/target/release/my-api /usr/local/bin
# Set the command to run your application
CMD ["my-api"]
когда я запускаю docker run -p 8080:8080 my-api, я получаю ошибку: env был пуст и не установлен
[INFO] - "Trying to Connect MongoDB..."
thread 'main' panicked at src/db.rs:43:75:
MONGO_URI must be set.: NotPresent
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
это то, чего мне здесь не хватает, и другой способ использования --config ? вместо этого установите ручную среду
Я читал случаи в Интернете, но моей темы там нет, потому что ржавчина новая,
@kmdreko твой комментарий должен быть ответом


Здесь существует более одного возможного ответа. Давайте посмотрим несколько вариантов.
Опция 1
У вас может быть несколько файлов Docker (например: dockerfile/dockerfile.local), которые копируют в образ определенные файлы конфигурации. Внутри dockerfile.local у вас должно быть:
COPY dev-config.toml config.toml
Вариант 2 Вы можете закодировать, как показано в этом посте на Reddit, конфигурацию env, которая будет загружаться динамически на основе определенных правил.
Твоя проблема Поскольку я не вижу всей структуры вашего проекта, я бы посоветовал вам запустить локально RUN Cargo build --release и посмотреть, работает ли он. Если это работает, откройте образ докера (вот так) и проверьте, имеют ли скопированные файлы ту же структуру, что и ваш локальный проект.
[env] от использования файла груза --config влияет только на вызовы груза с ним (т. е. cargo build, cargo run и т. д.). Итак, вы можете сделать эту работу как есть, используя:
CMD = ["cargo", "run", "--release", "--config", "dev-config.toml"]
Хотя на самом деле я не рекомендую этого делать, даже если cargo build был запущен заранее.
Вместо этого я бы предложил прочитать Как передать переменные среды в контейнеры Docker? Такие варианты, как использование --env-file или запуск с конфигурацией docker-compose, вероятно, будут более приемлемыми. Если вы используете файл .env, вы можете изменить свой код Rust для загрузки из него, используя крейт dotenvy вместо предоставленного в конфигурации груза.
[env]от использования файла конфигурации груза влияет только наcargoвызовы с ним (т. е.cargo build,cargo runи т. д.). Если вы не хотите использовать груз в своемCMD(и я бы не советовал этого делать), я бы предложил Как передать переменные среды в контейнеры Docker?