ОНОВЛЕННЯ 2016-03-02 : Станом на Docker 1.9.0, Docker назвав томи, які замінюють контейнери лише для даних . Відповідь нижче, як і моя пов’язана публікація в блозі, все ще має значення в сенсі того, як думати про дані всередині докера, але розглянути можливість використання названих томів для реалізації описаної нижче схеми, а не контейнерів даних.
Я вважаю, що канонічним способом вирішити це є використання контейнерів лише для даних . При такому підході весь доступ до даних обсягу здійснюється через контейнери, які використовують -volumes-from
контейнер даних, тому uid / gid хоста не має значення.
Наприклад, один випадок використання, наведений у документації, - це резервне копіювання обсягу даних. Для цього використовується інший контейнер для резервного копіювання через tar
, і він теж використовується -volumes-from
для монтажу гучності. Тому я думаю, що ключовим моментом для grok є: замість того, щоб думати про те, як отримати доступ до даних на хості з належними дозволами, подумайте, як робити все, що вам потрібно - резервне копіювання, перегляд веб-сайтів тощо - через інший контейнер . Самі контейнери повинні використовувати послідовні uid / gids, але їм не потрібно нічого робити на хості, залишаючи таким чином портативний.
Це порівняно нове для мене, але якщо у вас є конкретні випадки використання, сміливо коментуйте, і я спробую розширити відповідь.
ОНОВЛЕННЯ : Для даного випадку використання у коментарях ви можете мати зображення some/graphite
для запуску графіту та зображення some/graphitedata
як контейнер даних. Отже, ігноруючи порти тощо, Dockerfile
зображення some/graphitedata
є чимось на зразок:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
Створіть та створіть контейнер даних:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
У some/graphite
Dockerfile також має бути однаковий uid / gids, тому це може виглядати приблизно так:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
І він би виконувався так:
docker run --volumes-from=graphitedata some/graphite
Гаразд, тепер це дає нам наш графітовий контейнер та пов'язаний з ним контейнер, призначений лише для даних, із правильним користувачем / групою (зауважте, що ви можете повторно використовувати some/graphite
контейнер для контейнера даних, переосмислюючи введення / cmd під час його запуску, але маючи їх як окремі зображення ІМО зрозуміліше).
Тепер скажемо, що ви хочете щось відредагувати у папці даних. Тому замість того, щоб прив’язувати том до хосту та редагувати його там, створіть новий контейнер, щоб виконати цю роботу. Давайте назвемо це some/graphitetools
. Дозволяє також створити відповідного користувача / групу, як і some/graphite
зображення.
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
Ви можете зробити це DRY шляхом успадкування від some/graphite
або some/graphitedata
в Dockerfile, або замість створення нового зображення просто повторно використовувати одне із існуючих (переопределення вхідної точки / cmd за необхідності).
Тепер ви просто запускаєте:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
а потім vi /data/graphite/whatever.txt
. Це прекрасно працює, оскільки всі контейнери мають одного і того ж користувача графіту з відповідним uid / gid.
Оскільки ви ніколи не монтуєте /data/graphite
з хоста, вам не байдуже, як uid / gid хоста приєднується до uid / gid, визначеному всередині graphite
та graphitetools
контейнерів. Ці контейнери тепер можна розгорнути на будь-який хост, і вони продовжуватимуть працювати бездоганно.
Акуратне в цьому полягає в тому, що вони graphitetools
можуть мати всілякі корисні утиліти та сценарії, які тепер ви також можете розгорнути на портативний спосіб.
ОНОВЛЕННЯ 2 : Після написання цієї відповіді я вирішив написати більш повну публікацію в блозі про такий підхід. Я сподіваюся, що це допомагає.
ОНОВЛЕННЯ 3 : Я виправив цю відповідь і додав більше конкретики. Раніше він містив деякі невірні припущення щодо права власності та perms - права власності зазвичай призначаються під час створення обсягу, тобто в контейнері даних, оскільки саме тоді створюється том. Дивіться цей блог . Однак це не є вимогою - ви можете просто використовувати контейнер даних як "довідку / обробку" і встановити право власності / perms в іншому контейнері через chown в точці входу, який закінчується gosu для запуску команди як правильного користувача. Якщо когось цікавить такий підхід, будь ласка, прокоментуйте, і я можу надати посилання на зразок, використовуючи цей підхід.