J'essaye d'utiliser tini
dans mon Dockerfile mais j'obtiens une erreur.
J'ai utilisé l'exemple de code du fichier readme tini
.
# ... code which builds /app/foo # Add Tini ENV TINI_VERSION v0.18.0 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini RUN chmod +x /tini ENTRYPOINT ["/tini", "--"] # Run the program when the container starts CMD ["/app/foo"]
Je m'attends à ce que mon programme s'exécute sans avoir PID=1
mais à la place j'obtiens: standard_init_linux.go:207: exec user process caused "no such file or directory"
ÉDITER:
/app/foo
est créé au début du Dockerfile. Il n'y a aucun problème avec /app/foo
. Pour preuve de cela, si je commente la ligne ENTRYPOINT
(ou si je supprime tout le code lié à tini
), my /app/foo
fonctionne bien, sauf pour le fait qu'il a PID=1
3 Réponses :
Comme David le mentionne, vous devez vérifier ce qui est téléchargé. Si vous l'exécutez manuellement dans une image Alpine, vous verrez le problème exact:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Notez la partie liée dynamiquement et le fait qu'elle recherche la libc. L'erreur dans un scénario alpin vous indique que la libc n'existe pas. Vous verriez également cela avec une image à gratter.
Vous voudrez soit obtenir une version de tini qui est complètement compilée statiquement, soit passer à un système avec la libc installée. Pour le premier, avec tini, c'est aussi simple que de télécharger une URL différente:
$ docker run -it --rm alpine /bin/sh / # apk add file ... / # apk add curl ... / # curl -sSL https://github.com/krallin/tini/releases/download/v0.18.0/tini >tini / # chmod 755 tini / # file tini tini: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=38c262787814dc459678c8f24710bbde944b7e56, stripped / # ldd tini /lib64/ld-linux-x86-64.so.2 (0x7f1beab2a000) libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f1beab2a000) Error relocating tini: __fprintf_chk: symbol not found / # ./tini /bin/sh: ./tini: not found / # ls -al /lib64/ld-linux-x86-64.so.2 ls: /lib64/ld-linux-x86-64.so.2: No such file or directory
Une autre cause du problème répertorié ci-dessus peut être qu'un script est appelé qui utilise un shell non disponible. Par exemple, lorsque la première ligne du script est
#!/bin/sh
Ensuite, cela nécessite bash
sur le système. Changer bash
en sh(ell)
par défaut pour le système peut être une solution. Alors, remplacez par
#!/bin/bash
Autre cause: une ligne incorrecte se termine dans le fichier. Linux attend des LF
, et si votre hôte est Windows, le script que vous souhaitez exécuter aura des CRLF
.
Mauvaise architecture; la chose qui est téléchargée est en fait un fichier tar ou une page HTML; manque des bibliothèques partagées (surtout si vous êtes en cours d' exécution sur une
scratch
d' image sans libc); ...Où avez-vous créé / app / foo?
@BMitch, / app / foo est créé au début du Dockerfile. J'ai édité la question pour clarifier.
@JoelFan dans ce cas, le processus qui rend / app / foo n'est pas correct. Je ne peux pas vraiment déboguer un commentaire.
Publier les résultats de
docker exec <container-name> sh -c 'ls /app
Peut-être qu'au lieu de nous dire à quoi ressemble le Dockerfile, montrez-nous simplement le Dockerfile réel. Notez également qu'au lieu d'utiliser
tini
vous pouvez simplement utiliser l'option--init
pourdocker run
.@larsks, c'est la partie pertinente du Dockerfile. Apparemment
--init
ne fonctionne pas avecdocker-compose
, ce que j'utiliseBien sûr, ce n'est pas quelque chose que vous passeriez à la ligne de commande
docker-compose
; c'est un attribut sur les services.Je l'ai fait fonctionner avec "init: true" (et en supprimant tout le code
tini
etENTRYPOINT
) dans une certaine mesure .... Mon processus n'a plus PID = 0 ... Cependant, la transmission du signal ne fonctionne pas ... quand j'appuie sur Ctrl-C, mon processus ne reçoit pas le signal ... je vais créer une nouvelle question pour cela