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
.
Тогда у меня две проблемы:
Я могу
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, но я не может заставить его работать.Я не могу понять, как использовать другой путь внутри "
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
.