Как я могу смонтировать папку, созданную сборкой образа?
Самый простой способ - вообще избежать этого пути: запустить команду git clone
с хоста. Копировать данные из созданного образа не так просто, и если важной частью процесса сборки является передача контента на хост, вы не можете делать все из файла Docker.
Если данные вы на самом деле имеет дело с данными конфигурации (как следует из названия), проверка (копии) файлов в репозитории с файлом docker-compose.yml
является разумным подходом. Часто вы будете включать эти файлы в сам репозиторий приложения, если вы также контролируете этот репозиторий. Затем вы можете привязать-смонтировать каталог как обычно:
backend:
build: .
ports:
- "4000:4000"
volumes:
- ./configs:/git_folder/configs
Если это данные приложения, вы можете сохранить их в именованном томе. Вы не сможете получить к нему прямой доступ с хоста. Docker заполнит том содержимым из изображения, но только при первом запуске контейнера : если вы измените изображение, объем останется неизменным.
version: '3'
volumes:
configs:
services:
backend:
build: .
ports:
- "4000:4000"
volumes:
- configs:/git_folder/configs
Третий подход состоит в том, чтобы при запуске вашего контейнера определять, пуст ли каталог данных, и, если да, заполнять его. Вы упоминаете изображение postgres
в качестве примера, и именно это оно делает (запускает команду initdb
PostgreSQL, если известный файл не существует). Вы можете написать такой сценарий:
#!/bin/sh
# Create the `configs` directory if it's empty
if [ -f /git_folder/configs/some_file ]; then
cp -a /git_folder/configs_base/* /git_folder/configs
fi
# Run the main container command
exec "$@"
В вашем Dockerfile сделайте этот сценарий ENTRYPOINT
. Вы должны вызывать его, используя синтаксис JSON -array. Не заменяйте entrypoint:
в docker-compose.yml
(и особенно не заменяйте его на то, что меняет обычное значение command:
команды оболочки).
COPY entrypoint.sh /git_folder
RUN chmod +x /git_folder/entrypoint.sh
ENTRYPOINT ["/git_folder/entrypoint.sh"]
CMD python manage.py runserver