Данные потеряны после «docker-compose down -volume»?

#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