Огромные файлы в контейнерах Docker

Мне нужно создать образ Docker (и, следовательно, контейнеры из этого образа), который использует большие файлы (содержащие геномные данные, таким образом достигающие размера ~ 10 ГБ).

Как я должен оптимизировать их использование? Должен ли я включать их в контейнер (например, COPY large_folder large_folder_in_container)? Есть ли лучший способ ссылаться на такие файлы? Дело в том, что мне кажется странным помещать такой контейнер (который будет >10 ГБ) в мой приватный репозиторий. Интересно, есть ли способ прикрепить к контейнеру своего рода том, не упаковывая все эти ГБ вместе.

Спасибо.


person Eleanore    schedule 15.09.2016    source источник


Ответы (3)


Должен ли я включать их в контейнер (например, COPY large_folder large_folder_in_container)?

Если вы сделаете это, они будут включены в образ, а не в контейнер: вы можете запустить 20 контейнеров из этого образа, фактическое используемое дисковое пространство все равно будет составлять 10 ГБ.

Если бы вы создали другой образ из своего первого образа, многоуровневая файловая система повторно использовала бы слои из родительского образа, и новый образ все равно был бы «всего» 10 ГБ.

person VonC    schedule 15.09.2016
comment
Это точно полезно. Но меня беспокоит быстрота системы, когда я захожу и вытаскиваю образ из реестра (для запуска контейнера). Я пытаюсь вписать это в конвейер CI/CD, который потребует (на этапе развертывания) загрузки контейнера в новый экземпляр OpenStack (через Packer). Поскольку такие экземпляры всегда разные, мне потребуется каждый раз, когда я прохожу конвейер CD, загружать огромный контейнер во вновь созданный экземпляр OpenStack (без какого-либо ранее загруженного слоя) и, таким образом, перемещать 10 ГБ при каждой фиксации. Это лучшее решение, которое можно было найти? - person Eleanore; 15.09.2016
comment
@Eleanore Как только изображение будет загружено в локальный реестр докеров вашего подчиненного устройства, контейнер запустится немедленно. Но если образ меняется, лучше всего постепенно создавать новый образ на основе предыдущего и включать только изменения. При этом, если все 10 ГБ меняются от одного изображения к другому... у вас действительно проблема. - person VonC; 15.09.2016

Есть ли лучший способ ссылаться на такие файлы?

Если у вас уже есть какой-то способ распространения данных, я бы использовал «привязку монтирования», чтобы прикрепить том к контейнерам.

docker run -v /path/to/data/on/host:/path/to/data/in/container <image> ...

Таким образом, вы можете изменить изображение, и вам не придется каждый раз повторно загружать большой набор данных.

Если вы хотите использовать реестр для распространения большого набора данных, но хотите управлять изменениями в наборе данных отдельно, вы можете использовать контейнер тома данных с Dockerfile следующим образом:

FROM tianon/true
COPY dataset /dataset
VOLUME /dataset

Из контейнера приложения вы можете подключить этот том, используя:

docker run -d --name dataset <data volume image name>
docker run --volumes-from dataset <image> ...

В любом случае, я думаю https://docs.docker.com/engine/tutorials/dockervolumes/ это то, что вы хотите.

person dnephin    schedule 15.09.2016
comment
Не работает, вы не можете запустить контейнер без точки входа. Альтернативой является hub.docker.com/r/tianon/true. - person stackoverflowed; 28.02.2019

У меня возникли проблемы с json-файлом размером 900 МБ и изменением ограничения памяти в настройках, и это исправлено.

введите здесь описание изображения

person kizziah    schedule 21.04.2021
comment
Ссылка на этот ответ stackoverflow .com/questions/44533319/ - person kizziah; 22.04.2021