Оригінальне запитання: Як користуватися інструкцією VOLUME в Dockerfile?
Справжнє питання, яке я хочу вирішити, - як монтувати томи хостів у контейнери докера в Dockerfile під час збирання, тобто, docker run -v /export:/export
під час роботи docker build
.
Причиною цього є те, що, будуючи речі в Docker, я не хочу, щоб ці ( apt-get install
) кеші були зафіксовані в одному докері, а щоб ділитися / використовувати їх повторно. Це головна причина, що я задаю це питання.
Останнє оновлення:
Перед docker v18.09 правильною відповіддю має бути відповідь, що починається з:
Існує спосіб монтажу гучності під час збирання, але він не включає Dockerfiles.
Однак це було погано заявленою, організованою та підтримуваною відповіддю. Коли я перевстановлював вміст свого докера, я натрапив на наступну статтю:
Докеризуйте службу apt-cacher-ng
https://docs.docker.com/engine/examples/apt-cacher-ng/
Це рішення докера на це / моє питання, не прямо, а опосередковано. Це православний спосіб, коли докер пропонує нам це зробити. І я визнаю, це краще, ніж те, про що я тут намагався запитати.
Інший спосіб - нещодавно прийнята відповідь , наприклад, Buildkit в v18.09.
Виберіть те, що вам підходить.
Було: Було рішення - рокер, який був не з Докера, але тепер, коли рокер припинено, я знову повертаю відповідь до "Неможливо" .
Старе оновлення: Отже, відповідь "Неможливо". Я можу прийняти це як відповідь, оскільки мені відомо, що це питання широко обговорювалося на веб-сторінці https://github.com/docker/docker/isissue/3156 . Я можу зрозуміти, що портативність є найважливішою проблемою для розробника докера; але як користувач докера, я мушу сказати, що дуже розчарований з приводу цієї відсутньої функції. Дозвольте мені закінчити міркування цитатою з вищезгаданої дискусії: " Я б хотів використовувати Gentoo як базове зображення, але, безумовно, не хочу> 1 Гб даних дерева Portage знаходитись у будь-якому з шарів, коли зображення буде побудовано. Ви може мати гарний компактний контейнер, якби не гігантське дерево переносу, яке не повинно з'являтися на зображенні під час встановлення."Так, я можу використовувати wget або curl для завантаження всього, що мені потрібно, але той факт, що лише розгляд портативності змушує мене завантажувати> 1 Гб дерева Portage кожного разу, коли я створюю базове зображення Gentoo, не є ні ефективним, ні зручним для користувачів. Далі Більше того, сховище пакетів ВИНАГО буде знаходитись під / usr / portage, тому ВЖЕ ПОРТУЄМО під Gentoo.Знову я поважаю це рішення, але, будь ласка, дозвольте мені висловити своє розчарування також у середній час. Дякую.
Оригінальне запитання в деталях:
З
Поділіться каталогіми через томи
http://docker.readthedocs.org/en/v0.7.3/use/working_with_volumes/
в ньому йдеться про те, що функція обсягів даних "доступна з версії 1 API віддаленого доступу Docker". Мій докер має версію 1.2.0, але я знайшов, що приклад, наведений у цій статті, не працює:
# BUILD-USING: docker build -t data .
# RUN-USING: docker run -name DATA data
FROM busybox
VOLUME ["/var/volume1", "/var/volume2"]
CMD ["/usr/bin/true"]
Який правильний спосіб у Dockerfile монтувати встановлені хостом томи в контейнери докера за допомогою команди VOLUME?
$ apt-cache policy lxc-docker
lxc-docker:
Installed: 1.2.0
Candidate: 1.2.0
Version table:
*** 1.2.0 0
500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
100 /var/lib/dpkg/status
$ cat Dockerfile
FROM debian:sid
VOLUME ["/export"]
RUN ls -l /export
CMD ls -l /export
$ docker build -t data .
Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM debian:sid
---> 77e97a48ce6a
Step 1 : VOLUME ["/export"]
---> Using cache
---> 59b69b65a074
Step 2 : RUN ls -l /export
---> Running in df43c78d74be
total 0
---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
---> Running in 8e4916d3e390
---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551
$ docker run data
total 0
$ ls -l /export | wc
20 162 1131
$ docker -v
Docker version 1.2.0, build fa7b24f
VOLUME ~/host_dir ~/container_dir
. Дискусія досить обширна, то є короткий спосіб узагальнити, в чому причина?