Docker - Как получить доступ к тому, не подключенному к контейнеру?

У меня есть (был) контейнер данных, в котором есть том, используемый другими контейнерами (--volumes-from).

Контейнер данных был случайно удален.

К счастью, том не был удален.

Есть ли способ повторно запустить контейнер данных и указать его ОБРАТНО на этот том?


person Matt Bryson    schedule 13.01.2016    source источник


Ответы (3)


Есть ли способ повторно запустить контейнер данных и указать его НАЗАД на этот том?

Конечно, я подробно описал это в разделе "Как восстановить данные из удаленного контейнера Docker? Как повторно подключить его к данным?"

Вам нужно создать новый контейнер с тем же VOLUME (но его путь /var/lib/docker/volumes/... будет пустым или с исходным содержанием)

Затем вы перемещаете свой устаревший том на путь тома нового контейнера.

В более общем случае, всякий раз, когда я запускаю контейнер тома данных, я регистрирую путь к его тому в файле (чтобы повторно использовать этот путь позже, если мой контейнер случайно удален)

person VonC    schedule 13.01.2016
comment
Ты звезда, звучит как идеальное решение. Моя единственная проблема сейчас состоит в том, чтобы попытаться выяснить, какой из 50 томов на этой машине тот, который мне нужен!! Как только это будет сделано, я воспользуюсь вашим подходом для отслеживания используемого тома. Привет, м - person Matt Bryson; 14.01.2016

Не совсем уверен, но вы можете попробовать

docker run -i -t --volumes-from yourvolume ubuntu /bin/bash

Я думаю, тогда вы сможете получить доступ к каталогу.

person Emile    schedule 13.01.2016
comment
Пока у вас все еще есть свой объем, я считаю, что запуск любого другого контейнера с --volumes-from должен повторно подключиться. - person Emile; 13.01.2016
comment
У меня все еще есть том, но не контейнер, который его создал. а значение --volumes-from - это имя контейнера, которого больше не существует... - person Matt Bryson; 13.01.2016
comment
Боюсь, у меня мало опыта, я только что смог сам понять объемы. Я не совсем уверен, что вы имеете в виду, говоря, что у вас все еще есть том. Публикация вашего docker ps -a output может помочь кому-то еще определить, что вы можете сделать. - person Emile; 13.01.2016
comment
Когда вы создаете, строите и запускаете контейнер Docker с внешним томом (данные записываются на хост), вы получаете «образ», «контейнер» и «том». Я удалил «изображение» и «контейнер», но «том» все еще там. Проблема в том, что после того, как «контейнер», связанный с «томом», исчез, я не вижу, как вернуться к «тому». - person Matt Bryson; 14.01.2016

Когда я пришел к этому вопросу, меня больше всего беспокоила потеря данных. Вот как я скопировал данные из тома в AWS S3:

# Create a dummy container - I like Python
host$ docker run -it -v my_volume:/datavolume1 python:3.7-slim bash

# Prepare AWS stuff
# executing 'cat ~/.aws/credentials' on your development machine
# will likely show them
python:3.7-slim$ pip install awscli
python:3.7-slim$ export AWS_ACCESS_KEY_ID=yourkeyid
python:3.7-slim$ export AWS_SECRET_ACCESS_KEY=yoursecrectaccesskey

# Copy
python:3.7-slim$ aws s3 cp /datavolume1/thefile.zip s3://bucket/key/thefile.zip

В качестве альтернативы вы можете использовать aws s3 sync.

MySQL/MariaDB

Мой конкретный пример был о MySQL/MariaDB. Если вы хотите сделать резервную копию базы данных MySQL / MariaDB, просто выполните

$ mysqldump -u [username] -p [database_name] \
            --single-transaction --quick --lock-tables=false \
            > db1-backup-$(date +%F).sql

Вы также можете рассмотреть

  • --skip-add-drop-table: Пропустить создание таблицы, если она уже существует. Без этого флага таблица удаляется.
  • --complete-insert: добавьте имена столбцов. Без этого флага может быть несоответствие столбцов.

Чтобы восстановить резервную копию:

$ mysql -u [username] -p [database_name] < [filename].sql
person Martin Thoma    schedule 14.06.2019