Sejarah masalah migrasi penyimpanan buruh pelabuhan (root buruh pelabuhan)

Tidak lebih dari beberapa hari yang lalu, diputuskan di salah satu server untuk memindahkan penyimpanan buruh pelabuhan (direktori tempat buruh pelabuhan menyimpan semua file kontainer dan gambar) ke bagian terpisah, yang
mempunyai kapasitas yang lebih besar. Tugas itu tampak sepele dan tidak menandakan masalah...

Mari kita mulai:

1. Hentikan dan matikan semua container aplikasi kita:

docker-compose down

jika wadahnya banyak dan komposisinya berbeda, Anda bisa melakukan ini:

docker rm -f $(docker ps -q)

2. Hentikan daemon buruh pelabuhan:

systemctl stop docker

3. Pindahkan direktori ke lokasi yang diinginkan:

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

4. Kami memberitahu daemon buruh pelabuhan untuk mencari di direktori baru. Ada beberapa opsi: gunakan flag -g untuk mengarahkan daemon ke jalur baru, atau konfigurasi systemd, yang kami gunakan. Atau symlink. Saya tidak akan menjelaskan terlalu banyak detail tentang ini, ini ada di Internet. penuh dengan manual tentang memindahkan root buruh pelabuhan ke lokasi baru.

5. Jalankan daemon buruh pelabuhan dan pastikan daemon tersebut terlihat di tempat yang tepat:

systemctl status docker

Di salah satu jalur keluaran kita akan melihat:

β”œβ”€19493 /usr/bin/dockerd --data-root=/docker/data/storage

Kami memastikan bahwa opsi diteruskan ke daemon, sekarang mari kita periksa apakah opsi tersebut diterapkan (terima kasih inkvizitor68sl)!

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

6. Mari kita mulai aplikasi kita:

docker-compose up -d

7. Periksa

Dan di sinilah kesenangan dimulai, DBMS, MQ, semuanya baik-baik saja! Basis datanya utuh, semuanya berfungsi... kecuali nginx. Kami memiliki nginx sendiri yang dibangun dengan Kerberos dan pelacur. Dan melihat log kontainer menunjukkan bahwa ia tidak dapat menulis ke /var/tmp - Izin ditolak. Aku meremas pelipisku dengan jariku dan mencoba menganalisis situasinya... Bagaimana ini mungkin? Gambar Docker tidak berubah. Kami baru saja memindahkan direktori. Itu selalu berhasil, dan ini dia untuk Anda... Demi percobaan, saya masuk ke wadah dengan tangan saya dan mengubah hak atas direktori ini, ada akar, akar 755, telah memberi akar, akar 777. Dan semuanya dimulai... Sebuah pemikiran mulai terdengar di kepalaku - semacam omong kosong... Saya berpikir, mungkin saya tidak memperhitungkan sesuatu...

Saya memutuskan bahwa kami jatuh cinta dengan hak akses ke file selama transfer. Kami menghentikan aplikasi, daemon buruh pelabuhan, menghapus direktori baru dan menyalin direktori /var/lib/docker menggunakan rsync -a.

Saya rasa semuanya sudah baik-baik saja sekarang, mari kita angkat aplikasi Docker.

Aaand... masalahnya tetap ada... Mataku bergerak-gerak. Saya bergegas ke konsol mesin virtual saya, di mana saya menjalankan berbagai tes, saya memiliki gambar nginx ini, dan saya naik ke dalam wadah, dan di sini hak atas direktori /var/tmp adalah root, root 777. Artinya, sama seperti yang harus saya atur secara manual. Tapi gambarnya identik!

Sistem file xfs digunakan di mana-mana.

Saya membandingkan menggunakan perintah

docker inspect my-nginx:12345

Semua hash identik, semuanya satu lawan satu. Baik di server maupun di mesin virtual saya. Saya menghapus image nginx lokal dan menariknya lagi dari registri, yang karena beberapa alasan ada di mesin yang sama. Dan masalahnya sama.. Sekarang mata kedua saya kedutan.

Aku sudah tidak ingat lagi pikiran apa yang ada di kepalaku, selain berteriak β€œAAAAAAAAAA” dan lain-lain. Saat itu jam 4 pagi, dan kode sumber Docker digunakan untuk memahami prinsip hashing lapisan gambar. Membuka kaleng minuman energi ketiga. Dan pada akhirnya saya sadar bahwa hashing hanya memperhitungkan file, isinya, tapi BUKAN HAK AKSES! Artinya, secara misterius hak kami telah hilang, selinux dinonaktifkan, acl tidak digunakan, dan tidak ada sedikit pun yang lengket.

Saya menghapus gambar lokal, juga menghapus gambar dari registri buruh pelabuhan dan mendorongnya lagi. Dan semuanya berhasil. Ternyata selama pengalihan hak tersebut hilang, baik di dalam gambar lokal maupun di dalam gambar yang ada di registri. Seperti yang sudah saya katakan, karena beberapa alasan, letaknya di mobil yang sama. Dan hasilnya, dalam satu direktori /var/lib/docker.

Dan mengantisipasi pertanyaan apakah mereka mencoba mengembalikan pandangan buruh pelabuhan ke direktori lama - tidak, mereka tidak mencoba, sayangnya, keadaan tidak mengizinkannya. Ya, dan saya benar-benar ingin mencari tahu.

Setelah menulis artikel ini, solusi untuk masalah tersebut tampak jelas bagi saya, tetapi pada saat analisis tampaknya tidak demikian. Sejujurnya, saya mencari di Google dan tidak menemukan situasi serupa.

Hasil: Saya menyelesaikan masalahnya, saya masih tidak mengerti alasannya =(

Jika ada yang tahu, menebak, mendapat gambaran tentang kemungkinan penyebab masalah ini, saya akan sangat senang mendengar pendapat Anda di komentar!

Sumber: www.habr.com

Tambah komentar