Задать вопрос
rusbaron
@rusbaron
Не стыдно не знать, стыдно не интересоваться

Как копируют файлы из docker в хост при создании контейнера?

Dockerfile
FROM alpine:latest

ENV ROOT_DIRECTORY=/caddyserver
ENV CONF_DIRECTORY=/caddyserver/cfg
ENV WWW_DIRECTORY=/caddyserver/www
ENV LOGS_DIRECTORY=/caddyserver/logs

#ARG Plugins='http.cache,net,http.git,http.ipfilter'

VOLUME $CONF_DIRECTORY $WWW_DIRECTORY $LOGS_DIRECTORY

RUN apk add --no-cache openssh-client git

ENV Email=''
ENV CPU=''

EXPOSE 80 443 2015


CMD $ROOT_DIRECTORY/caddy -conf $ROOT_DIRECTORY/cfg/Caddyfile -log $ROOT_DIRECTORY/logs/caddy.log -cpu $CPU -email $EMAIL -agree

Описал такой dockerfile, при попытке запуска контейнер падает
docker create \
  --name=caddy \
  -v /opt/Docker/caddy/cfg:/caddyserver/cfg \
  -v /opt/Docker/caddy/www:/caddyserver/www \
  -v /opt/Docker/caddy/logs:/caddyserver/logs \
  -e EMAIL=mail@mail -e CPU=2 \
  -p 80:80 -p 443:443 -p 2015:2015 \
  caddy

В логах пишет что не может найти конфигурационный файл в папке cfg. На сколько я понимаю, это происходит из за того, что я монтирую в раздел cfg папку с хоста и она пустая. В момент создания докер контейнера, при команде COPY я копирую структуру и там содержится базовая конфигурация. Как сделать так, чтобы при начальном запуске эта конфигурация была видна с хоста?
Ну т.е. был пример с gitlab, при первом запуске контейнера он в нужные папки кладёт уже данные, логи с контейнера(В моём примере лог пишется и виден с хоста), а при последующих запусках уже монтирует и использует их.
  • Вопрос задан
  • 590 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@rustler2000
погромист сикраш
Никак.
Точнее, только если кто-то в контейнере при отсутствие файлов их перезапишет.
И стандартных mount ведёт себя точно также - никакого магического "merge"
Ответ написан
rusbaron
@rusbaron Автор вопроса
Не стыдно не знать, стыдно не интересоваться
Т.к. есть ещё один подписавшийся на вопрос, добавлю что я нашёл
Провентилировав этот вопрос наткнулся на следующее, как это сделано у linuxserver.io
Создав образ на основе их образа alpine ( которому кстати можно параметрами передать PUID и GUID для файлов и папок ) , необходимые файлы конфигурации кладём в нужную папку(они обычно это делают в папку defaults), затем создаём файл 20-config по пути /etc/cont-init.d/ и добавляем туда необходимые условия
Пример 20-config в моём случае
#!/usr/bin/with-contenv bash

# make folders
mkdir -p \
	/caddyserver/{cfg,logs,www}

# copy config
[[ ! -f /caddyserver/cfg/Caddyfile ]] && cp \
	/defaults/Caddyfile /caddyserver/cfg/Caddyfile


# permissions
chown -R abc:abc \
	/caddyserver
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы