Contexte

J'ai un exécutable créé via mix release qui fonctionne très bien lorsque je l'exécute avec start sur ma machine locale. Cependant, mon image docker se bloque lorsque j'essaie de start l'exécutable et je ne sais pas pourquoi.

Docker

FROM elixir:1.10

# Install Hex + Rebar
RUN mix do local.hex --force, local.rebar --force

COPY . /
WORKDIR /

ENV MIX_ENV=prod
RUN mix do deps.get --only $MIX_ENV, deps.compile
RUN mix release

EXPOSE 8080
ENV PORT=8080
ENV SHELL=/bin/bash

CMD ["_build/prod/rel/my_app/bin/my_app", "start"]

Ceci est mon fichier docker. Il ne fait rien de spécial à part compiler puis essayer d'exécuter la version via start.

Erreur

Cependant, lorsque j'exécute l'image docker avec docker run -p 8080:8080 my-app:1.0 docker plante :

/_build/prod/rel/my_app/releases/0.1.0/../../erts-10.5/bin/erl: 12: exec: /_build/prod/rel/my_app/erts-10.5/bin/erlexec: Exec format error

Recherche

Au début, je pensais que cela se produisait parce que le fichier _build/prod/rel/my_app/bin/my_app manquait #!/usr/bin/env bash en haut (après avoir lu quelques questions SO).

Bien qu'en effet il n'ait pas cela, il a quelque chose d'autre qui devrait également fonctionner : #!/bin/sh

Donc cette théorie est sortie.

Question

Quelque chose ne va pas avec mon Dockerfile ? Comment puis-je me débarrasser de cette erreur?

0
Flame_Phoenix 3 nov. 2020 à 18:04

1 réponse

Meilleure réponse

RCA

C'était délicat. Après avoir lu d'autres questions similaires (et les commentaires de @potibas et @Stefano), j'ai découvert ce qui se passait.

Donc, comme je l'ai dit, le fichier de version fonctionne bien sur ma machine locale. Cela se produit parce que sur ma machine locale, les fichiers étaient compilés sur son système d'exploitation (OS).

Maintenant, la VM docker n'a pas le même système d'exploitation que ma machine locale. Cela compte à cause de cette ligne :

COPY . /

Ici, je copie tout du répertoire de travail vers docker. Y compris les binaires et les dépendances compilés pour le système d'exploitation de ma machine locale.

Cela a causé le problème mentionné ci-dessus.

Solution

Il y a 2 solutions possibles.

  1. Supprimez les dossiers _build et deps de l'image après la commande COPY, via RUN rm -r _build et RUN rm -r deps/.
  2. Ajoutez les dossiers mentionnés ainsi que tous les fichiers non essentiels dans un fichier .dockerignore.

J'ai personnellement opté pour la deuxième option, car elle me permet d'avoir une image plus épurée.

0
Flame_Phoenix 3 nov. 2020 à 15:25