Как смонтировать каталог, созданный при сборке docker образа? - PullRequest
2 голосов
/ 26 мая 2020

Мой файл docker -compose выглядит следующим образом:

version: "3"

services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: qwerty
      POSTGRES_USER: qwerty
    volumes:
      - /data/db:/var/lib/postgresql/data

  backend:
    build:
      context: .
      dockerfile: dockerfile_backend
    image: backend:dev1.0.0
    entrypoint: ["sh", "-c"]
    command: python manage.py runserver
    ports:
      - "4000:4000"

В моем dockerfile_backend у меня есть оператор git clone, который клонирует проект из репозитория git. Есть папка под названием configs, которая входит в состав клона git. Мне нужно смонтировать эту папку как том (аналогично точке подключения тома postgres). Монтирование configs необходимо, потому что во время выполнения содержимое папки изменяется или обновляется, эти изменения не должны быть потеряны.

Как я могу смонтировать папку, созданную сборкой образа?

Я попытался добавить следующие тома в службу backend:

    volumes:
      - /data/configs:/git_folder/configs

Здесь проблема в том, что точка монтирования (/data/configs) изначально пуста, поэтому папка изображений (/git_folder/configs) также становится пустой. .

1 Ответ

1 голос
/ 26 мая 2020

Как я могу смонтировать папку, созданную сборкой образа?

Самый простой способ - вообще избежать этого пути: запустить команду 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
...