mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-21 14:08:11 +02:00
Image : l'ARG des drapeaux whisper était hors de portée — cmake tournait à nu
Le build de 51 minutes a échoué au lien final : « libcuda.so.1 not found », références cuMem* non résolues, et une libggml-cuda.so PARTAGÉE alors que BUILD_SHARED_LIBS=OFF est censé être passé. Ce dernier détail était le vrai indice : les drapeaux n'atteignaient pas cmake du tout. ARG WHISPER_CMAKE_FLAGS="…" était déclaré entre deux étapes. Règle Docker : un ARG posé après un FROM appartient à l'étape où il apparaît ; les « ARG » nus des étapes whisperbuild-* héritent, eux, du scope GLOBAL — où rien n'était défini. Valeur vide, cmake sans aucun drapeau : ggml en bibliothèques partagées (échec de lien contre les stubs du pilote), et surtout -march=native — le SIGILL de la PR #18 revenu en silence sur les deux binaires. Les tests du Dockerfile n'y voyaient rien : ils vérifiaient le texte, pas les règles de portée de Docker. - L'ARG remonte avant le premier FROM, à côté de LLAMACPP_IMAGE. - Chaque étape vérifie désormais SON binaire : un ldd qui montre libggml ou libwhisper en dynamique fait échouer le build sur-le-champ, au lieu de laisser partir un binaire qui ne trouvera pas ses .so dans l'image finale. - TestDockerfileArgFlagsGlobal verrouille la position de l'ARG, ancré en début de ligne — une première version se laissait berner par une occurrence en commentaire, sa contre-épreuve l'a montré. libcuda.so.1 reste une dépendance dynamique normale du binaire CUDA : c'est le pilote, injecté à l'exécution par le NVIDIA Container Toolkit, et l'édition de liens la résout via les stubs du toolkit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3ewMAsXhkw9RY11kb9Dc9
This commit is contained in:
1 parent
66b53c8255
commit
e177d54e39
2 files changed
+48
-7
No files matched your search
@@ -155,6 +155,31 @@ func TestDockerfileCudaAssezRecent(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// L'ARG qui porte les drapeaux doit être déclaré AVANT le premier FROM. Un ARG
|
||||
// posé entre deux étapes appartient à l'étape où il apparaît ; les « ARG » nus
|
||||
// des étapes whisperbuild-* héritent alors du scope global — vide. cmake a
|
||||
// tourné sans aucun drapeau : ggml en bibliothèques partagées (échec de lien),
|
||||
// et -march=native — le SIGILL de la PR #18 revenu en silence. 51 minutes de
|
||||
// build pour le découvrir.
|
||||
func TestDockerfileArgFlagsGlobal(t *testing.T) {
|
||||
b, err := os.ReadFile("../../Dockerfile")
|
||||
if err != nil {
|
||||
t.Fatalf("lecture du Dockerfile : %v", err)
|
||||
}
|
||||
src := string(b)
|
||||
// Ancré en début de ligne : une occurrence dans un commentaire ne compte
|
||||
// pas — c'est précisément ainsi qu'une première version de ce test s'est
|
||||
// laissée berner par sa propre contre-épreuve.
|
||||
argLoc := regexp.MustCompile(`(?m)^ARG WHISPER_CMAKE_FLAGS=`).FindStringIndex(src)
|
||||
fromLoc := regexp.MustCompile(`(?m)^FROM `).FindStringIndex(src)
|
||||
if argLoc == nil {
|
||||
t.Fatal("ARG WHISPER_CMAKE_FLAGS= introuvable dans le Dockerfile")
|
||||
}
|
||||
if fromLoc != nil && argLoc[0] > fromLoc[0] {
|
||||
t.Error("ARG WHISPER_CMAKE_FLAGS= est déclaré APRÈS un FROM : les étapes whisperbuild-* hériteront d'une valeur vide et cmake tournera sans aucun drapeau")
|
||||
}
|
||||
}
|
||||
|
||||
func clefs(m map[string]string) []string {
|
||||
out := make([]string, 0, len(m))
|
||||
for k := range m {
|
||||
|
||||
Reference in new issue
Block a user