Tengo un servidor Docker del que quiero hacer una copia de seguridad. Mi carpeta de implementación tiene propiedad y permisos muy específicos para admitir mis contenedores:
$ ls -lhaF /opt/docker
total 32K
drwxr-xr-x 7 devops devops 4.0K Aug 23 02:34 ./
drwxr-xr-x 6 root root 4.0K Aug 23 04:20 ../
drwxrwxr-x 2 devops devops 4.0K Aug 21 00:00 .certs/
drwxrwxr-x 2 devops devops 4.0K Aug 23 03:53 .scripts/
-rw-rw-r-- 1 devops devops 1.2K Aug 21 01:52 docker-compose.yml
drwxrwxr-x 4 1000 1000 4.0K Aug 21 02:05 minecraft/
drwxrwxr-x 4 devops devops 4.0K Aug 20 23:38 pihole/
drwx------ 19 70 70 4.0K Aug 19 01:31 postgres/
Luego intento comprimir esta carpeta usando el siguiente comando. Por lo que he leído, para preservar los permisos/propiedad del archivo es necesario ejecutarlo tar
como root/sudo:
$ sudo tar -czpf "/tmp/server-backup.tar.gz" --directory="/opt/docker" .
Este comando comprime la carpeta, pero al inspeccionar .tar.gz se muestra que la propiedad de todas las carpetas ahora es raíz:
$ tar -tvf /tmp/server-backup.tar.gz
drwxr-xr-x root/root 0 2021-08-23 12:10 ./
drwxr-xr-x root/root 0 2021-08-23 12:10 ./minecraft/
-rw-r--r-- root/root 2 2021-08-23 12:10 ./minecraft/whitelist.json
-rw-r--r-- root/root 111 2021-08-23 12:10 ./minecraft/usercache.json
-rw-r--r-- root/root 1204 2021-08-23 12:10 ./minecraft/server.properties
-rw-r--r-- root/root 43626592 2021-08-23 12:10 ./minecraft/minecraft_server.1.17.1.jar
-rw-r--r-- root/root 68 2021-08-23 12:10 ./minecraft/eula.txt
-rw-r--r-- root/root 2 2021-08-23 12:10 ./minecraft/banned-players.json
-rw-r--r-- root/root 2 2021-08-23 12:10 ./minecraft/banned-ips.json
# -- Other minecraft files
drwxr-xr-x root/root 0 2021-08-23 12:10 ./.certs/
# -- Certs folder contents redacted
drwx------ root/root 0 2021-08-23 12:10 ./postgres/
drwx------ root/root 0 2021-08-23 12:10 ./postgres/pg_subtrans/
-rw------- root/root 8192 2021-08-23 12:10 ./postgres/pg_subtrans/0000
drwx------ root/root 0 2021-08-23 12:10 ./postgres/pg_multixact/
drwx------ root/root 0 2021-08-23 12:10 ./postgres/pg_multixact/offsets/
-rw------- root/root 8192 2021-08-23 12:10 ./postgres/pg_multixact/offsets/0000
drwx------ root/root 0 2021-08-23 12:10 ./postgres/pg_multixact/members/
-rw------- root/root 8192 2021-08-23 12:10 ./postgres/pg_multixact/members/0000
drwx------ root/root 0 2021-08-23 12:10 ./postgres/pg_xact/
-rw------- root/root 8192 2021-08-23 12:10 ./postgres/pg_xact/0000
# -- Other postgres files
drwxr-xr-x root/root 0 2021-08-23 12:10 ./pihole/
drwxr-xr-x root/root 0 2021-08-23 12:10 ./pihole/etc-pihole/
-rw-r--r-- root/root 0 2021-08-23 12:10 ./pihole/etc-pihole/custom.list
-rw-r--r-- root/root 5201920 2021-08-23 12:10 ./pihole/etc-pihole/gravity.db
-rw-r--r-- root/root 485 2021-08-23 12:10 ./pihole/etc-pihole/setupVars.conf
-rw-r--r-- root/root 0 2021-08-23 12:10 ./pihole/etc-pihole/setupVars.conf.update.bak
-rw-r--r-- root/root 1812161 2021-08-23 12:10 ./pihole/etc-pihole/list.1.raw.githubusercontent.com.domains
-rw-r--r-- root/root 73728 2021-08-23 12:10 ./pihole/etc-pihole/pihole-FTL.db
-rw-r--r-- root/root 0 2021-08-23 12:10 ./pihole/etc-pihole/pihole-FTL.conf
-rw-r--r-- root/root 37 2021-08-23 12:10 ./pihole/etc-pihole/local.list
-rw-r--r-- root/root 95 2021-08-23 12:10 ./pihole/etc-pihole/list.1.raw.githubusercontent.com.domains.sha1
-rw-r--r-- root/root 20 2021-08-23 12:10 ./pihole/etc-pihole/localbranches
drwxr-xr-x root/root 0 2021-08-23 12:10 ./pihole/etc-pihole/migration_backup/
-rw-r--r-- root/root 65 2021-08-23 12:10 ./pihole/etc-pihole/migration_backup/adlists.list
-rw-r--r-- root/root 618 2021-08-23 12:10 ./pihole/etc-pihole/dns-servers.conf
-rw-r--r-- root/root 20 2021-08-23 12:10 ./pihole/etc-pihole/GitHubVersions
-rw-r--r-- root/root 44 2021-08-23 12:10 ./pihole/etc-pihole/localversions
drwxr-xr-x root/root 0 2021-08-23 12:10 ./pihole/etc-dnsmasq.d/
-rw-r--r-- root/root 1475 2021-08-23 12:10 ./pihole/etc-dnsmasq.d/01-pihole.conf
drwxr-xr-x root/root 0 2021-08-23 12:10 ./.scripts/
-rwxr-xr-x root/root 1638 2021-08-23 12:10 ./.scripts/create-backup.sh
-rwxr-xr-x root/root 511 2021-08-23 12:10 ./.scripts/new-cert-pihole.sh
-rwxr-xr-x root/root 345 2021-08-23 12:10 ./.scripts/fix-permissions.sh
-rw-r--r-- root/root 1170 2021-08-23 12:10 ./docker-compose.yml
Si intento extraer el archivo .tar.gz, podemos confirmar que se ha perdido toda la propiedad:
$ sudo mkdir /tmp/server-backup
$ sudo tar -xzpf /tmp/server-backup.tar.gz --directory=/tmp/server-backup
$ ls -lhaF /tmp/server-backup
total 32K
drwxr-xr-x 7 root root 4.0K Aug 23 12:10 ./
drwxrwxrwt 13 root root 4.0K Aug 23 12:16 ../
drwxr-xr-x 2 root root 4.0K Aug 23 12:10 .certs/
drwxr-xr-x 2 root root 4.0K Aug 23 12:10 .scripts/
-rw-r--r-- 1 root root 1.2K Aug 23 12:10 docker-compose.yml
drwxr-xr-x 4 root root 4.0K Aug 23 12:10 minecraft/
drwxr-xr-x 4 root root 4.0K Aug 23 12:10 pihole/
drwx------ 19 root root 4.0K Aug 23 12:10 postgres/
Por lo que he encontrado, se supone que preservar la propiedad y los permisos es el comportamiento predeterminado para tar
. ¿Hay algo que me falta aquí? Me gustaría poder hacer una copia de seguridad del estado de mi servidor sin alterar la delicada propiedad de los archivos que requieren algunos de los contenedores acoplables que ejecuto.
Información del sistema:
$ lsb_release -d
Description: Ubuntu 20.04.3 LTS
$ uname -a
Linux rpi-1 5.4.0-1042-raspi #46-Ubuntu SMP PREEMPT Fri Jul 30 00:35:40 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
Respuesta1
Aparentemente, tar
no es el culpable aquí. Esto era parte de un script más grande para hacer una copia de seguridad de mi carpeta de implementación. Estaba copiando la carpeta antes de comprimirla para evitar inconsistencias de lectura mientras los contenedores aún se estaban ejecutando. El guión contenía lo siguiente:
cp -R "/opt/docker" "/tmp/server-backup"
tar -czf "/tmp/server-backup.tar.gz" --directory="/tmp/server-backup" .
La propiedad del archivo se perdía durante la copia de la carpeta. La -p
bandera es necesaria para preservar los permisos/propiedad en una copia de carpeta. El comando correcto hubiera sido este:
cp -Rp "/opt/docker" "/tmp/server-backup"
tar -czf "/tmp/server-backup.tar.gz" --directory="/tmp/server-backup" .