Docker run --mount делает все файлы доступными в другой папке во время RUN

Я хочу сделать папку на моем хост-компьютере доступной во время RUNзаявление. То есть аналогично эффекту запуска контейнера с-v:

docker run -v /path/on/host:/path/in/container mycontainer:tag

В контейнере это дает мне /path/in/container со всеми файлами / папками в path/on/host.

С этой целью я пробую экспериментальные варианты монтирования из https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md:

RUN --mount=type=bind,target=/path/on/host

Это дает мне папку /path/on/host вовремя RUN.

Тогда у меня две проблемы:

  1. Я могу ls файлы внутри /path/on/host, но не использовать их (например, catих). Я пытался изменитьtype напр. cache и используя sourceкак в https://devops.stackexchange.com/questions/6078/in-a-dockerfile-is-there-a-way-to-avoid-copying-files-to-make-them-accessible-t, но я не может заставить его работать.

  2. Я не могу понять, как использовать другой путь внутри "RUN изображение ", то есть /path/in/container вместо того /path/on/host.

1 ответ

Решение

Я думаю, вы неправильно поняли, что за RUN --mount=type=bind...синтаксис для. Из документации:

Этот тип монтирования позволяет связывать каталоги (только для чтения) в контексте или в образе с контейнером сборки.

Другими словами, это не позволяет вам получить доступ к произвольным каталогам хоста на этапе сборки. Это не аналог-v параметр командной строки на docker run. Это позволяет вам только:

  • Смонтируйте каталоги из контекста сборки или
  • Смонтируйте каталоги из другого этапа в многоэтапной сборке

Так, например, я могу смонтировать каталог из одного этапа сборки в следующий этап сборки:

# syntax=docker/dockerfile:experimental

FROM centos AS centos

FROM alpine
RUN --mount=type=bind,from=centos,source=/,target=/centos ls /centos > /root/centos.txt

Или если у меня есть каталог с именем example в моем контексте сборки я могу сделать это, чтобы смонтировать его в процессе сборки:

# syntax=docker/dockerfile:experimental

FROM centos AS centos

FROM alpine
RUN --mount=type=bind,source=example,target=/data cp /data/* /root/

Используемый синтаксис (без from указано)...

RUN --mount=type=bind,target=/path/on/host

... просто монтирует корень вашего контекста сборки на /path/on/hostвнутри контейнера. Помни этоtargetуказывает точку монтирования внутри контейнера. Например, если мой контекст сборки выглядит так:

.
├── Dockerfile
└── example
    └── README.md

А также example/README.md содержит:

This is a test.

И Dockerfile содержит RUN вариант, аналогичный тому, что вы используете:

# syntax=docker/dockerfile:experimental

FROM centos AS centos

FROM alpine
RUN --mount=type=bind,target=/data cat /data/example/README.md > /root/README.md

Затем, когда изображение построено, /root/README.md имеет содержание example/README.md.

Другие вопросы по тегам