Το κοντέινερ VPN τερματίζει με 'exec format error': λάθος πλατφόρμα
Το 'exec format error' σημαίνει ότι το δυαδικό αρχείο έχει μεταγλωττιστεί για άλλον επεξεργαστή, όχι ότι λείπει το NET_ADMIN. Διαβάστε το ευρετήριο της εικόνας πριν αλλάξετε διαδρομές ή διαπιστευτήρια.
Τα κοντέινερ που τερματίζουν αμέσως με exec format error προκαλούν το λάθος ένστικτο: προσθέστε μια δυνατότητα, προσαρτήστε μια συσκευή, επεξεργαστείτε τη διαμόρφωση του τούνελ. Κανένα από αυτά δεν φτάνει στο πρόβλημα. Ο πυρήνας δεν μπόρεσε να εκτελέσει καθόλου το δυαδικό αρχείο, κάτι που σε ένα κοντέινερ σχεδόν πάντα σημαίνει ότι η εικόνα στοχεύει διαφορετική αρχιτεκτονική CPU από αυτήν του κεντρικού υπολογιστή. Ό,τι θα μπορούσατε να αλλάξετε σε δρομολόγηση, διαπιστευτήρια ή προνόμια συμβαίνει αφού ξεκινήσει ένα πρόγραμμα, και κανένα πρόγραμμα δεν ξεκίνησε.
Το μήνυμα εκκίνησης που μοιάζει με σφάλμα διαμόρφωσης
Η αποτυχία μορφής exec προέρχεται από τον φορτωτή, πριν η εφαρμογή διαβάσει έστω μία ρύθμιση. Γι’ αυτό δεν παράγει καμία προειδοποίηση διαμόρφωσης και κανένα αρχείο καταγραφής τούνελ, επειδή δεν υπάρχει ζωντανή διεργασία να τα γράψει. Η αποτυχία είναι επίσης αξιοσημείωτα γρήγορη, συχνά πριν εμφανιστεί καθόλου γραμμή στο αρχείο καταγραφής του κοντέινερ. Το ίδιο σύντομο μήνυμα εμφανίζεται είτε το δυαδικό αρχείο είναι για άλλη αρχιτεκτονική, είτε για άλλο λειτουργικό σύστημα, είτε κατεστραμμένο.
Καταγράψτε το περιβάλλον εκτέλεσης και την αρχιτεκτονική μαζί με την ακριβή αναφορά εικόνας και έπειτα ελέγξτε τι προσφέρει πραγματικά αυτή η αναφορά. Στο Docker Desktop η πλατφόρμα του κοντέινερ ανήκει στην εικονική μηχανή Linux και όχι στον φορητό υπολογιστή, οπότε η αρχιτεκτονική του κεντρικού υπολογιστή από μόνη της μπορεί να παραπλανήσει. Διαβάστε τη λίστα εγγραφών του ευρετηρίου για αυτή την αναφορά, αντί για το κείμενο μάρκετινγκ στη σελίδα της ετικέτας.
Διαβάστε το ευρετήριο της εικόνας πριν από την εντολή εκτέλεσης
Όταν ένα μητρώο δημοσιεύει αναφορά πολλαπλών πλατφορμών, η ετικέτα δείχνει σε ένα ευρετήριο και κάθε εγγραφή ονομάζει μια πλατφόρμα με το δικό της digest. Εξετάστε την αναφορά που βρίσκεται υπό εξέταση, όχι μια γειτονική ετικέτα, και διαβάστε το ευρετήριο αντί να υποθέτετε τι περιέχει.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
Η πρώτη εντολή απαριθμεί τις πλατφόρμες που δημοσιεύει η αναφορά. Η δεύτερη αναφέρει την πλατφόρμα της εικόνας που υπάρχει ήδη τοπικά, και αυτήν θα εκτελέσει το περιβάλλον εκτέλεσης. Μια αναφορά με μία μόνο εγγραφή σημαίνει ότι κάθε κεντρικός υπολογιστής λαμβάνει το ίδιο δυαδικό αρχείο, και η ετικέτα δεν μπορεί να βοηθήσει μηχάνημα για το οποίο δεν χτίστηκε ποτέ.
Οι ετικέτες επιλέγουν μια παραλλαγή· δεν τη δημιουργούν
Ένα ευρετήριο πολλαπλών πλατφορμών επιτρέπει στο περιβάλλον εκτέλεσης να επιλέξει την αντίστοιχη εγγραφή, κάτι που είναι πραγματικά βολικό και συχνά λανθασμένα εκλαμβάνεται ως φορητότητα. Η επιλογή είναι αναζήτηση, όχι μετάφραση: αν η παραλλαγή απουσιάζει, δεν υπάρχει τίποτα να επιλέξετε. Η ίδια ετικέτα σε δύο κεντρικούς υπολογιστές μπορεί επομένως να καταλήξει σε δύο διαφορετικά δυαδικά αρχεία, και σε έναν υπολογιστή δεν καταλήγει σε τίποτα χρήσιμο.
Η καθήλωση με digest αφαιρεί την ασάφεια και επίσης καθιστά δυνατή μια μεταγενέστερη αναθεώρηση, επειδή το digest προσδιορίζει ακριβώς τα byte που δοκιμάστηκαν. Κρατήστε αυτό το digest μαζί με το αρχείο ανάπτυξης, αντί να βασίζεστε στην ετικέτα που έτυχε να είναι τρέχουσα.
Η εξομοίωση είναι μια διευθέτηση, όχι στρώμα μετάφρασης
Η εξομοίωση μέσω υποστηριζόμενου περιβάλλοντος εκτέλεσης μπορεί να εκτελέσει ορισμένα μη εγγενή φορτία χώρου χρήστη, οπότε ο απόλυτος ισχυρισμός ότι μια αρχιτεκτονική δεν μπορεί ποτέ να εκτελέσει την εικόνα μιας άλλης είναι λάθος. Δεν είναι επίσης γενική λύση. Η εξομοιωμένη εκτέλεση έχει διαφορετικά χαρακτηριστικά απόδοσης, και μια τετριμμένη διεργασία που ξεκινά δεν σας λέει τίποτα για το αν ένα φορτίο τούνελ συμπεριφέρεται αποδεκτά.
Ο οδηγός πολλαπλών πλατφορμών του Docker αντιμετωπίζει τις εγγενείς κατασκευές, τη διασταυρούμενη μεταγλώττιση και την εξομοίωση ως ξεχωριστές στρατηγικές, και αυτός είναι ο σωστός τρόπος να διαβάζετε τις επιλογές. Επιλέξτε μία συνειδητά και αξιολογήστε το φορτίο VPN με βάση αυτήν, αντί να υποθέτετε ισοδυναμία.
Τα δικαιώματα λύνουν διαφορετικό πρόβλημα
Η παραχώρηση δυνατότητας διαχείρισης δικτύου ή η διέλευση συσκευής TUN δεν μπορεί να κάνει ένα μη συμβατό εκτελέσιμο αρχείο να τρέξει. Αυτά είναι δικαιώματα εκτέλεσης που χρησιμοποιεί μια διεργασία σε λειτουργία· είναι αόρατα σε έναν φορτωτή που έχει ήδη απορρίψει το αρχείο.
Το αντίστροφο είναι εξίσου αληθές. Ένα εγγενές δυαδικό αρχείο δεν αποδεικνύει τίποτα για προνόμια, πρόσβαση σε συσκευές, ενσωμάτωση resolver ή την πολιτική επανεκκίνησης που χρειάζεται ένα τούνελ, επομένως ένα κοντέινερ που ξεκινά δεν είναι ακόμη κοντέινερ που λειτουργεί. Καθορίστε πρώτα το συμβόλαιο πλατφόρμας και μετά περάστε στο συμβόλαιο εκτέλεσης με τις τεκμηριωμένες επιλογές του.
Κρατήστε το digest της εικόνας, τον υποστηριζόμενο στόχο και τη διαμόρφωση μαζί στο ίδιο αρχείο. Μια ενημέρωση ετικέτας που αλλάζει σιωπηλά την αρχιτεκτονική είναι ευκολότερο να εντοπιστεί όταν το προηγούμενο digest είναι γραμμένο, από ό,τι όταν το μόνο σύμπτωμα είναι ένα γνωστό σφάλμα και ένα νέο απόγευμα αποσφαλμάτωσης.