Ιστορικό του προβλήματος μετεγκατάστασης αποθήκευσης docker (root docker)

Πριν από λίγες μέρες, αποφασίστηκε σε έναν από τους διακομιστές να μετακινηθεί ο χώρος αποθήκευσης docker (ο κατάλογος όπου το docker αποθηκεύει όλα τα αρχεία κοντέινερ και εικόνας) σε μια ξεχωριστή ενότητα, η οποία
είχε μεγαλύτερη χωρητικότητα. Το έργο φαινόταν τετριμμένο και δεν προμήνυε προβλήματα...

Ας αρχίσουμε:

1. Σταματήστε και σκοτώστε όλα τα δοχεία της εφαρμογής μας:

docker-compose down

εάν υπάρχουν πολλά δοχεία και είναι σε διαφορετικές συνθέσεις, μπορείτε να το κάνετε αυτό:

docker rm -f $(docker ps -q)

2. Σταματήστε το docker daemon:

systemctl stop docker

3. Μετακινήστε τον κατάλογο στην επιθυμητή θέση:

cp -r /var/lib/docker /docker/data/storage

4. Λέμε στο docker daemon να ψάξει στον νέο κατάλογο. Υπάρχουν πολλές επιλογές: είτε χρησιμοποιήστε τη σημαία -g για να δείξετε τον δαίμονα σε μια νέα διαδρομή, είτε διαμορφώσεις systemd, τις οποίες χρησιμοποιήσαμε. Ή ένας συμβολικός σύνδεσμος. Δεν θα μπω σε πολλές λεπτομέρειες σχετικά με αυτό, είναι στο Διαδίκτυο. γεμάτος εγχειρίδια για τη μετακίνηση docker root σε μια νέα τοποθεσία.

5. Ξεκινήστε το docker daemon και βεβαιωθείτε ότι φαίνεται στη σωστή θέση:

systemctl status docker

Σε μία από τις γραμμές εξόδου θα πρέπει να δούμε:

├─19493 /usr/bin/dockerd --data-root=/docker/data/storage

Σιγουρευτήκαμε ότι η επιλογή μεταβιβάστηκε στον δαίμονα, τώρα ας ελέγξουμε αν την εφάρμοσε (ευχαριστώ inkvizitor68sl)!

docker info | awk '/Root Dir/ {print $NF}' 

6. Ας ξεκινήσουμε την εφαρμογή μας:

docker-compose up -d

7. Έλεγχος

Και εδώ αρχίζει η διασκέδαση, DBMS, MQ, όλα καλά! Η βάση δεδομένων είναι άθικτη, όλα λειτουργούν... εκτός από το nginx. Έχουμε τη δική μας κατασκευή nginx με Kerberos και εταίρες. Και η προβολή των αρχείων καταγραφής κοντέινερ έδειξε ότι δεν μπορεί να γράψει στο /var/tmp - Η άδεια δεν επιτρέπεται. Ζυμώνω τους κροτάφους μου με τα δάχτυλά μου και προσπαθώ να αναλύσω την κατάσταση... Πώς είναι δυνατόν αυτό; Η εικόνα του Docker δεν άλλαξε. Μόλις μετακινήσαμε τον κατάλογο. Πάντα δούλευε, και εδώ είναι για σένα... Για χάρη του πειράματος, μπήκα στο κοντέινερ με τα χέρια μου και άλλαξα τα δικαιώματα σε αυτόν τον κατάλογο, υπήρχαν root, root 755, έδωσε root, root 777. Και όλα ξεκίνησαν... Μια σκέψη άρχισε να ακούγεται στο κεφάλι μου - κάποια ανοησία... Σκέφτηκα, καλά, ίσως δεν έλαβα κάτι υπόψη μου...

Αποφάσισα ότι ερωτευτήκαμε τα δικαιώματα πρόσβασης στα αρχεία κατά τη μεταφορά. Σταματήσαμε την εφαρμογή, το docker daemon, διαγράψαμε τον νέο κατάλογο και αντιγράψαμε τον κατάλογο /var/lib/docker χρησιμοποιώντας rsync -a.

Νομίζω ότι όλα είναι καλά τώρα, ας ανεβάσουμε την εφαρμογή Docker.

Αα και... το πρόβλημα παρέμεινε... Το μάτι μου έτρεμε. Πήγα βιαστικά στην κονσόλα της εικονικής μου μηχανής, όπου έκανα διάφορα τεστ, είχα αυτήν την εικόνα nginx και ανέβηκα μέσα στο κοντέινερ και εδώ τα δικαιώματα στον κατάλογο /var/tmp είναι root, root 777. Δηλαδή, το το ίδιο όπως έπρεπε να ρυθμίσω χειροκίνητα. Οι εικόνες όμως είναι ίδιες!

Το σύστημα αρχείων xfs χρησιμοποιήθηκε παντού.

Σύγκρισα χρησιμοποιώντας την εντολή

docker inspect my-nginx:12345

Όλα τα hashes είναι πανομοιότυπα, όλα ένα προς ένα. Τόσο στον διακομιστή όσο και στην εικονική μου μηχανή. Διέγραψα την τοπική εικόνα nginx και την τράβηξα ξανά από το μητρώο, το οποίο για διάφορους λόγους βρίσκεται στο ίδιο μηχάνημα. Και το πρόβλημα είναι το ίδιο... Τώρα το δεύτερο μάτι μου τρέμει.

Δεν θυμάμαι πια τι σκέψεις είχα στο κεφάλι μου, εκτός από το να φώναζα «ΑΑΑΑΑΑΑΑ» και άλλα πράγματα. Ήταν 4 η ώρα το πρωί και ο πηγαίος κώδικας Docker χρησιμοποιήθηκε για την κατανόηση της αρχής του κατακερματισμού των επιπέδων εικόνας. Άνοιξε το τρίτο κουτί με ενεργειακό ποτό. Και στο τέλος κατάλαβα ότι ο κατακερματισμός λαμβάνει υπόψη μόνο το αρχείο, το περιεχόμενό του, αλλά ΟΧΙ ΔΙΚΑΙΩΜΑΤΑ ΠΡΟΣΒΑΣΗΣ! Δηλαδή, κατά κάποιον μυστηριώδη τρόπο τα δικαιώματά μας έχουν χαθεί, το selinux είναι απενεργοποιημένο, το acl δεν χρησιμοποιείται και δεν υπάρχει κανένα sticky bit.

Διέγραψα την τοπική εικόνα, διέγραψα επίσης την εικόνα από το μητρώο του docker και την έσπρωξα ξανά. Και όλα λειτούργησαν. Αποδεικνύεται ότι κατά τη μεταφορά χάθηκαν τα δικαιώματα, τόσο εντός της τοπικής εικόνας όσο και εντός της εικόνας που βρίσκεται στο μητρώο. Όπως είπα ήδη, για διάφορους λόγους βρισκόταν στο ίδιο αυτοκίνητο. Και ως αποτέλεσμα, σε έναν κατάλογο /var/lib/docker.

Και προβλέποντας την ερώτηση αν προσπάθησαν να επιστρέψουν το βλέμμα του λιμενεργάτη στον παλιό κατάλογο - όχι, δεν προσπάθησαν, δυστυχώς, οι συνθήκες δεν το επέτρεψαν. Ναι, και ήθελα πολύ να το καταλάβω.

Μετά τη συγγραφή αυτού του άρθρου, η λύση στο πρόβλημα μου φαίνεται προφανής, αλλά τη στιγμή της ανάλυσης δεν φαινόταν έτσι. Ειλικρινά, έψαξα στο Google και δεν βρήκα παρόμοιες καταστάσεις.

Αποτέλεσμα: Έλυσα το πρόβλημα, ακόμα δεν καταλαβαίνω τον λόγο =(

Αν κάποιος ξέρει, μαντεύει, είχε ένα όραμα σχετικά με τις πιθανές αιτίες αυτού του προβλήματος, θα χαρώ πολύ να σας ακούσω στα σχόλια!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο