Ako extrahovať dump z kontajnera a uložiť ho na hostiteľský stroj?
sobes.tech AI
Odpoveď od AI
Na získanie dumpu z kontajnera a jeho uloženie na hostiteľskú stanicu môžete použiť niekoľko prístupov v závislosti od typu dumpu (napríklad databáza, pamäť).
1. Použitie docker exec a presmerovanie výstupu:
Táto metóda je vhodná, ak máte príkaz vnútri kontajnera, ktorý generuje dump na štandardný výstup.
// Nahradíme <meno_kontajnera> menom alebo ID vášho kontajnera,
// <príkaz_dumpu> príkazom, ktorý generuje dump (napríklad pg_dump, mysqldump),
// a <cesta_na_hosta> cestou, kam uložiť súbor na hostiteľovi.
docker exec <meno_kontajnera> <príkaz_dumpu> > <cesta_na_hosta>/dump.sql
Príklad s PostgreSQL:
// Získanie dumpu databázy 'mydatabase' z kontajnera 'my-postgres-container'
// a uloženie na hostiteľa do súboru /tmp/postgres_dump.sql.
docker exec my-postgres-container pg_dump -U myuser mydatabase > /tmp/postgres_dump.sql
Príklad s MySQL:
// Získanie dumpu databázy 'mydatabase' z kontajnera 'my-mysql-container'
// a uloženie na hostiteľa do súboru /tmp/mysql_dump.sql.
docker exec my-mysql-container mysqldump -u myuser -p mydatabase > /tmp/mysql_dump.sql
2. Použitie docker cp:
Táto metóda je vhodná, ak je dump možné uložiť do dočasného súboru vnútri kontajnera pomocou príkazu, a potom tento súbor skopírovať na hostiteľa.
// Nahradíme <meno_kontajnera> menom alebo ID vášho kontajnera,
// <cesta_v_kontajneri> cestou, kde bude vytvorený dočasný dump súbor vnútri kontajnera,
// a <cesta_na_hosta> cestou, kam uložiť súbor na hostiteľovi.
// Krok 1: Vygenerovať dump do dočasného súboru vnútri kontajnera
docker exec <meno_kontajnera> <príkaz_dumpu_s_výstupom_do_súboru> <cesta_v_kontajneri>/temp_dump.sql
// Krok 2: Skopírovať súbor dumpu na hostiteľa
docker cp <meno_kontajnera>:<cesta_v_kontajneri>/temp_dump.sql <cesta_na_hosta>/dump.sql
// Krok 3: (voliteľné) Odstrániť dočasný súbor vnútri kontajnera
docker exec <meno_kontajnera> rm <cesta_v_kontajneri>/temp_dump.sql
Príklad s PostgreSQL:
// Krok 1: Vygenerovať dump databázy 'mydatabase' do dočasného súboru /tmp/temp_dump.sql vnútri kontajnera 'my-postgres-container'
docker exec my-postgres-container pg_dump -U myuser mydatabase > /tmp/temp_dump.sql
// Krok 2: Skopírovať súbor /tmp/temp_dump.sql z kontajnera na hostiteľa do súboru /tmp/postgres_dump.sql
docker cp my-postgres-container:/tmp/temp_dump.sql /tmp/postgres_dump.sql
// Krok 3: Odstrániť dočasný súbor /tmp/temp_dump.sql vnútri kontajnera
docker exec my-postgres-container rm /tmp/temp_dump.sql
3. Použitie Volume:
Lepší a pohodlnejší spôsob pre pravidelné vytváranie dumpov je použitie Docker Volume. Môžete pripojiť adresár z hostiteľa do kontajnera a ukladať dumpy priamo do tohto adresára.
// Príklad Docker Compose súboru s pripojením volume
services:
mydb:
image: my-database-image
volumes:
- ./dumps:/app/dumps // Pripojenie adresára 'dumps' z hostiteľa do '/app/dumps' vnútri kontajnera
# ... ďalšie nastavenia služby
Vnútri kontajnera vaša generujúca príkazová sekvencia by mala ukladať dump do pripojeného adresára (/app/dumps v tomto príklade). Súbory budú automaticky dostupné na hostiteľovi v adresári ./dumps (relatívne k umiestneniu Docker Compose súboru).
4. Pamäťový dump (Memory Dump):
Na získanie dumpu pamäte kontajnera môžete použiť príkazy operačného systému hostiteľa alebo špecializované nástroje, ako sú coredumpctl (na systémoch s systemd) alebo gcore. Pred použitím týchto metód je potrebné zabezpečiť, že v kontajneri je povolené vytváranie coredumpov a správne nastavené limity zdrojov (ulimits).
// Príklad získania coredumpu z procesu s PID 123 vnútri kontajnera
// (vyžaduje príslušné práva na hostiteľovi a nastavenia v kontajneri)
sudo gcore -o /tmp/coredump 123
Dôležité je poznamenať, že získanie dumpu pamäte je zložitejšia úloha a vyžaduje hlboké pochopenie procesov vnútri kontajnera a nastavení operačného systému hostiteľa.
Výber metódy závisí od konkrétnej úlohy, typu dumpu a vašich preferencií. Pre pravidelné dumpy databáz je najflexibilnejší a najspoľahlivejší prístup použitie Volume. Pre jednorazové získanie dumpu alebo ladenie sú docker exec a docker cp tiež efektívne možnosti.