Я хочу использовать контейнер Docker для запуска утилиты (в частности, Terraform) с использованием локальных файлов. Чтобы быстро перебрать код (например, my_stuff.tf
), я хочу привязать монтирование моего рабочего каталога. Однако я хочу считать некоторые вещи относительно стабильными и статичными, например плагины. По сути, я хочу, чтобы вещи обрабатывались тремя способами:
.terraform/
- это стабильные вещи, которые должны существовать в контейнере, но не в моем каталоге хоста, но должны сохраняться даже после монтирования. my_stuff.tf
существует как внутри контейнера (потому что init
нуждается в нем), так и в директории хоста (потому что я хочу его отредактировать). Я хочу, чтобы моя версия каталога хоста переопределила версию контейнера. terraform.tfstate
может не существовать ни в одном месте для начала, но генерируется во время работы. Я хочу, чтобы он сохранялся в моей директории хоста, как только он существует.
(и я думаю, 4-я категория, такая как README.md
, где мне все равно, есть она или нет)
В моем случае TF ожидает, что оба .terraform/
, где настроены плагины, и terraform.tfstate
(один из выходов, которые я хочу перехватить с помощью моего bind-mount) будут находиться в одном каталоге, поэтому я не могу просто использовать разные каталоги для содержимого контейнера и подключенного содержимого.
# Dockerfile
FROM plugin_source AS plugins
FROM terraform_base
COPY --from=plugins terraform-provider-X /bin/
COPY my_stuff.tf /app/
WORKDIR /app
RUN /bin/terraform init
И моя команда запуска:
docker run --rm -i -t --mount source=$PWD,target=/app,type=bind my_terraform <some-tf-command>
Есть ли удобный способ заставить монтироваться bind так же, как именованные тома сделать при первой инициализации, как описано в https://docs.docker.com/storage/bind-mounts/#mount -into-a-непустой-каталог-на-контейнере ? В настоящее время кажется, что мне, возможно, придется написать небольшой сценарий точки входа, который вставит символические ссылки в мою рабочую директорию.