#docker #docker-compose
#docker #docker-compose
Вопрос:
Я добавил неназванный том в файл docker-compose. Например.:
app:
volumes:
- /external/path:/internal/path
После того, как я протестировал docker-compose, я снял его с:
sudo docker-compose down --volumes
Я предположил, что он удаляет только именованные тома. Однако, похоже, это не так, и я потерял данные /external/path
.
Есть ли какой-либо способ восстановить его?
Комментарии:
1. Этого не должно быть; это привязка , а не именованный или анонимный том. Вы уверены , что имеете на это право
/internal/path
? Во время работы контейнера вы видите содержимое внутри/external/path
?2. Я также подумал, что этого делать не следует. Однако я не могу придумать ничего другого, что могло бы вызвать это. Это произошло бы, если бы это был именованный том, на который я указал этот путь, не так ли? Любые другие идеи, что еще могло вызвать это? Единственное, что я сделал, это протестировал разные docker-compose, увеличив и уменьшив их. К сожалению, /external/path теперь пуст. Следовательно, я больше не вижу никакого содержимого. (Для целей восстановления весь том теперь отключен)
3. Я предполагаю, что в контейнере вы записывали данные во что-то, что, по вашему мнению, было привязкой, но на самом деле было эфемерным контейнером. Таким образом, данные могут быть доступны в контейнере, при условии, что они не были выброшены. Посмотрите, есть
docker ps --all
ли у вас это.
Ответ №1:
Это не поведение docker-compose. Вот минимальный пример, показывающий, как это работает:
$ mkdir bind
$ vi docker-compose.yml
$ cat docker-compose.yml
version: '3.7'
services:
test:
image: busybox
command: tail -f /dev/null
volumes:
- /vol/anonymous
- named:/vol/named
- ./bind:/vol/bind
volumes:
named:
Запустите службу и создайте данные в томах:
$ docker-compose up -d
Creating network "test_default" with the default driver
Creating volume "test_named" with default driver
Creating test_test_1 ... done
$ docker-compose exec test sh
/ # cd /vol
/vol # ls
anonymous bind named
/vol # ls anonymous/
/vol # echo hello anonymous >anonymous/data.txt
/vol # echo hello bind >bind/data.txt
/vol # echo hello named >named/data.txt
/vol # exit
Проверьте контейнер, чтобы получить анонимный идентификатор тома:
$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80e4bf2c65b1 busybox "tail -f /dev/null" About a minute ago Up About a minute test_test_1
$ docker inspect 80e
[
{
"Id": "80e4bf2c65b1a28dcf33e74af30ed53896b09bb236490f4bc9cfdcd2074c4d2c",
"Created": "2020-12-04T15:19:48.088249937Z",
"Path": "tail",
"Args": [
"-f",
"/dev/null"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 10947,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-12-04T15:19:48.628296876Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
...
"Mounts": [
{
"Type": "volume",
"Name": "test_named",
"Source": "/home/docker/volumes/test_named/_data",
"Destination": "/vol/named",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
},
{
"Type": "bind",
"Source": "/home/bmitch/data/docker/test/bind",
"Destination": "/vol/bind",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "volume",
"Name": "d3fdead93dba2db526e6b1fb8501bf7fd8b412108efec8a720f137ccf3e0f021",
"Source": "/home/docker/volumes/d3fdead93dba2db526e6b1fb8501bf7fd8b412108efec8a720f137ccf3e0f021/_data",
"Destination": "/vol/anonymous",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Просмотр данных во всех трех томах из другого контейнера:
$ docker run -it --rm
-v d3fdead93dba2db526e6b1fb8501bf7fd8b412108efec8a720f137ccf3e0f021:/vol/anonymous
-v "$(pwd)/bind:/vol/bind"
-v test_named:/vol/named
busybox sh
/ # cd vol
/vol # find .
.
./bind
./bind/data.txt
./anonymous
./anonymous/data.txt
./named
./named/data.txt
/vol # exit
Данные привязки монтирования видны снаружи контейнера:
$ ls -al bind
total 12
drwxr-xr-x 2 bmitch bmitch 4096 Dec 4 10:20 .
drwxr-xr-x 14 bmitch bmitch 4096 Dec 4 10:19 ..
-rw-r--r-- 1 root root 11 Dec 4 10:20 data.txt
Теперь остановите службу с --volumes
помощью опции, такой же, как -v
:
$ docker-compose down --volumes
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default
Removing volume test_named
Именованный и анонимный том исчез, но данные при подключении привязки все еще существуют:
$ docker volume ls
DRIVER VOLUME NAME
local 1fb7aea19e66f595f4900407eac7240479eed40dc3b91b72bb129182ae82240c
local a8820115a79de66173a18c2cd7bb3a08a1f4075b88c0bed8c1aa1de92792c601
local d555896ef05e0410003a4ae4cce943b9719a3306061fde0d03424d42b7f0d6cd
...
$ ls -al bind
total 12
drwxr-xr-x 2 bmitch bmitch 4096 Dec 4 10:20 .
drwxr-xr-x 14 bmitch bmitch 4096 Dec 4 10:19 ..
-rw-r--r-- 1 root root 11 Dec 4 10:20 data.txt
Есть ли какой-либо способ восстановить его?
Если вы потеряли данные, потребуется восстановление из резервной копии. Docker не сохраняет данные вашего тома в другом месте, когда вы просите его что-то удалить.
Ответ №2:
Из документации:
-v, --volumes Remove named volumes declared in the `volumes`
section of the Compose file and anonymous volumes
attached to containers.
Таким образом, он также удаляет анонимные тома. И, по-видимому, привязки в этом случае считаются томами.
Комментарии:
1. Привязки не считаются такими же, как анонимные или именованные тома.
Ответ №3:
Не используйте down, а используйте stop
docker-compose stop