Предположим, у меня есть контейнер Docker и папка на моем хосте /hostFolder
. Теперь , если я хочу , чтобы добавить эту папку в контейнер Докер как объем, то я могу сделать это либо с использованием ADD
в Dockerfile
или установки его в качестве тома.
Все идет нормально.
Теперь /hostFolder
содержит подпапку /hostFolder/subFolder
.
Я хочу смонтировать /hostFolder
в контейнер Docker (независимо от того, имеет ли значение чтение-запись или только для чтения, для меня это работает), но я НЕ хочу, чтобы он был включен /hostFolder/subFolder
. Я хочу исключить это, и я также хочу, чтобы Docker-контейнер мог вносить изменения в эту подпапку, без последствий того, чтобы она также изменялась на хосте.
Это возможно? Если да, то как?
docker
dockerfile
Голо Роден
источник
источник
Ответы:
Используя docker-compose, я могу использовать node_modules локально, но игнорировать его в контейнере docker, используя следующий синтаксис в
docker-compose.yml
Таким образом, все в
./angularApp
сопоставлено,/opt/app
а затем я создаю другой том для монтирования,/opt/app/node_modules/
который теперь является пустым каталогом - даже если на моем локальном компьютере./angularApp/node_modules
не пусто.источник
/opt/app/node_modules/
другой каталог с тем же именем. Произошла ошибка: «Громкость занята»-v $(pwd):/build/ -v /build/node_modules
If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
Если вы хотите, чтобы подкаталоги игнорировались docker-compose, но были постоянными, вы можете сделать следующее
docker-compose.yml
:Это смонтирует ваш текущий каталог как общий том, но смонтирует постоянный том докера вместо вашего локального
node_modules
каталога. Это похоже на ответ @kernix, но это позволитnode_modules
сохраняться междуdocker-compose up
запусками, что, вероятно, является желаемым поведением.источник
docker-compose down
удалит контейнеры, но объем будет сохраняться, пока вы не запустите что-то вродеdocker system prune
node_modules:
именованного тома «игнорирует»/app/node_modules
в контейнере докера, может оказаться полезным это сообщение Как докер обрабатывает несколько типов монтирования?Чтобы исключить файл, используйте следующее
источник
Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Добавление косой черты не помогло./dev/null
в контейнер, как файл устройства.Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Это не совсем то, что ищет OP, но это было очень полезно для меня, так как мне нужно было исключить один файл.Во-первых, использование
ADD
инструкции в Dockerfile очень отличается от использования тома (либо через-v
аргумент to,docker run
либо черезVOLUME
инструкцию в Dockerfile).ADD
ИCOPY
команда просто взять копию файлов в то времяdocker build
запускаются. Эти файлы не обновляются до тех пор, пока с помощьюdocker build
команды не будет создан новый образ . В отличие от этого, использование тома означает, что «этот каталог не должен храниться в образе контейнера; вместо этого используйте каталог на хосте»; всякий раз, когда файл внутри тома изменяется, хост и контейнер увидят его немедленно.Я не верю, что вы можете достичь того, чего хотите, используя тома, вам придется переосмыслить структуру каталогов, если вы хотите это сделать.
Тем не менее, это довольно просто добиться использования
COPY
(что должно быть предпочтительнееADD
). Вы можете использовать.dockerignore
файл, чтобы исключить подкаталог, или вы можетеCOPY
все файлы затем сделатьRUN rm bla
чтобы удалить подкаталог.Помните, что любые файлы, которые вы добавляете в образ с
COPY
илиADD
должны быть в контексте сборки, то есть в или под каталогом, из которого вы запускаетеdocker build
.источник
.dockerignore
файл, чтобы исключить подкаталог (или даже каталог). Учитывая, что это заявленная цель файла, это довольно странно.squash
слоев. Один из них - github.com/goldmann/docker-squash, а другой -oc ex dockerbuild
из проекта openshift.Похоже, старое решение больше не работает (по крайней мере, для меня). Хотя создание пустой папки и сопоставление целевой папки с ней помогло.
источник
docker-compose 1.25.0-rc3
синтаксисом файла v3.С помощью командной строки Docker:
-v
Опция также может быть использована (кредит Богданом Mart ), но--mount
яснее и рекомендуются .источник
для людей, у которых также была проблема, что папка node_modules все еще перезаписывает из вашей локальной системы и наоборот
Это решение, с
/
последним следом после node_modules.источник
Чтобы исключить смонтированный файл, содержащийся в томе вашей машины, вам придется перезаписать его, выделив том же файлу. В вашем конфигурационном файле:
Пример в вашем dockerfile:
источник