Объем внутри Dockerfile здесь контрпродуктивен.Это будет монтировать анонимный том на каждом этапе сборки, и снова при запуске контейнера.Том на каждом шаге сборки сбрасывается после его завершения, а это значит, что вам нужно будет снова загрузить все содержимое для любого другого шага, нуждающегося в этих зависимостях.
Стандартная модель для этого - скопировать вашу спецификацию зависимости,запустите загрузку зависимостей, скопируйте код, а затем скомпилируйте или запустите код, выполнив 4 отдельных шага.Это позволяет Docker эффективно кэшировать слои.Я не знаком с ржавчиной или грузом конкретно, но я думаю, что это будет выглядеть так:
FROM rust:1.33.0
RUN rustup default nightly-2019-01-29
COPY Cargo.toml .
RUN cargo fetch # this should download dependencies
COPY src/ ./src/
RUN ["cargo", "build", "-Z", "unstable-options", "--out-dir", "/output"]
Другой вариант - включить некоторые экспериментальные функции с помощью BuildKit (доступно в 18.09), чтобы докер сохранил эти зависимостив том, что похоже на именованный том для вашей сборки.Этот каталог можно повторно использовать в разных сборках, но он никогда не будет добавлен к самому образу, что делает его полезным для таких вещей, как кэш загрузки.
# syntax=docker/dockerfile:experimental
FROM rust:1.33.0
VOLUME ["/output", "/usr/local/cargo"]
RUN rustup default nightly-2019-01-29
COPY Cargo.toml .
COPY src/ ./src/
RUN --mount=type=cache,target=/root/.cargo \
["cargo", "build", "-Z", "unstable-options", "--out-dir", "/output"]
Обратите внимание, что в приведенном выше примере предполагается, что груз кэширует файлы в / root /.грузы.Вам нужно будет проверить это и отрегулировать соответствующим образом.Я также не смешивал синтаксис монтирования с синтаксисом json exec, чтобы знать, работает ли эта часть.Вы можете прочитать больше об экспериментальных возможностях BuildKit здесь: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md
Включение BuildKit с 18.09 и более новых версий так же просто, как export DOCKER_BUILDKIT=1
, а затем запуск сборки из этой оболочки.