standard_init_linux.go: 190: el proceso de usuario exec causó "no existe tal archivo o directorio" - Docker

106

Cuando ejecuto mi imagen de Docker en Windows 10. Recibo este error:

standard_init_linux.go:190: exec user process caused "no such file or directory"

mi archivo de Docker es:

FROM openjdk:8

EXPOSE 8080

VOLUME /tmp

ADD appagent.tar.gz /opt/app-agent
ADD services.jar app.jar
ADD run.sh /run.sh

# Install compiler and perl stuff
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y gcc-multilib
RUN apt-get install -y perl

# Install Percona Toolkit
RUN apt-get install --yes percona-toolkit
RUN ["chmod", "+x", "/run.sh"]
ENTRYPOINT ["/run.sh"]

y el script comienza con #! / bin / sh

#!/bin/sh
set -e

JAVA_OPTS="-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/urandom"

if [ "${APPD_APP_NAME}" != "" ]; then
JAVA_AGENT="-javaagent:/opt/app-agent/javaagent.jar
fi

exec java ${JVM_OPTS} ${JAVA_OPTS} ${JAVA_AGENT} -jar /app.jar

Intenté el método 1: Intenté cambiar #! / Bin / sh a #! / Bin / bash pero obtuve el mismo error.

Método2 probado: agregado dos2unix en el archivo docker

RUN apt-get install -y dos2unix
RUN dos2unix /run.sh
gamechanger17
fuente

Respuestas:

149

Use notepad ++, vaya a editar -> Conversión EOL -> cambie de CRLF a LF.

Vikas Rathore
fuente
4
¡Perfecto! Tenía un archivo .sh agregado que se estaba ejecutando desde mi Dockerfile. Reemplacé los finales de línea y Ta Da. Gracias
Sweet Chilly Philly
No encontré esta opción en notepad ++ en 'pestaña de edición' pero la cambié haciendo clic en el botón del lado inferior derecho escrito en Windows (CR LF) y cambié a Unix. ¡Muchas gracias!
Tobo
Tengo el mismo problema y lo resuelvo como tu consejo. ¡Muchas gracias!
truthblue82
¡Gracias! ¡Funcionó bien! Yo sufría el mismo problema.
ironrainbow
1
Recibí este error al intentar compilar y ejecutar imágenes de Docker de ckan en Windows. Si se encuentra con este problema en un repositorio clonado, podría ser útil usar la configuración core.autocrlf durante la clonación, si es así, ejecute: git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hardCopiado de: github.com/LiveOverflow/PwnAdventure3/issues/11
Emil G
66

cambie el punto de entrada como se muestra a continuación. Funcionó para mi

ENTRYPOINT ["sh","/run.sh"]

Como señaló tuomastik en los comentarios , los documentos requieren que el primer parámetro sea el ejecutable:

ENTRYPOINT tiene dos formas:

ENTRYPOINT ["executable", "param1", "param2"] (forma ejecutiva, preferida)

ENTRYPOINT command param1 param2 (forma de concha)

pridad
fuente
Trabajó para mi. En este caso, ni siquiera necesitamos agregar #! / Bin / sh en el script de shell. Mencionar "sh" en ENTRYPOINT hace el trabajo
Gouravmoy Mohanty
8
¿Puede explicar por qué y cuándo es necesario el "sh"? Vi muchos ejemplos trabajando sin él.
Opsse
1
@Opsse Sin "sh", el procesamiento normal de shell no ocurre fuente
tuomastik
1
Resulta que en mi script ENTRYPOINT estaba usando /bin/bashcomo intérprete de shell, pero como mi imagen está basada en alpina, no venía con ella. He cambiado en mi escritura bashpor shy problema resuelto.
Morpheuz
56

Tuve el mismo problema al usar la alpineimagen.

Mi .sharchivo tenía la siguiente primera línea:

#!/bin/bash

Alpine no tiene bash. Así que cambiando la línea a

#!/bin/sh

o instalando bash con

apk add --no-cache bash

resolvió el problema para mí.

daB0bby
fuente
1
¡Esta! Debe estar en negrita en la página de Docker Hub de Apline.
hashlock
16

en mi caso tuve que cambiar el final de línea de CRLFa LFpara el run.sharchivo y el error desapareció.

Espero que esto ayude,
Kirsten

KirKone
fuente
1
Tengo que seguir arreglando los mismos archivos una y otra vez. Es como si Windows quisiera mantenerme en su ecosistema.
Jonathan Czitkovics
@JonathanCzitkovics tal vez debería verificar su configuración de git y la configuración de su editor de código
KirKone
10

Suponga que enfrenta este problema mientras ejecuta su go binary en un contenedor alpino. Exporta la siguiente variable antes de construir tu contenedor

# CGO has to be disabled for alpine
export CGO_ENABLED=0

Entonces go build

arulraj.net
fuente
dentro de Dockerfile, esto es, agregue ENV CGO_ENABLED = 0 antes de la línea de compilación go. Esto funcionó para mí.
Madhan Ganesh
en Dockerfile, debería ser:RUN export CGO_ENABLED=0 && go build
BMW
Esto también funcionaRUN CGO_ENABLED=0 go build
Alan Sereb
9

Es un problema de CRLF. Solucioné el problema usando esto:

git config --global core.eol lf

git config --global core.autocrlf input

find . -type f -print0 | xargs -0 dos2unix
Amine_Dev
fuente
¡Muchas gracias! Me salvó el día.
Alex
8

"Ningún archivo o directorio" proviene de Linux y he visto las siguientes causas:

La primera causa es en realidad no tener el archivo dentro de su contenedor. Algunas personas intentan ejecutar un comando desde el host sin agregarlo a su imagen. Algunas personas siguen su comando montando un volumen encima del comando que querían ejecutar. Si ejecuta el mismo contenedor, pero con un shell en lugar de su valor normal de punto de entrada / cmd, y ejecuta un ls /path/to/cmd, verá si existe.

La siguiente causa es ejecutar el comando incorrecto. Esto a menudo aparece con el formato json / exec del comando para ejecutar que no se analiza correctamente. Si ve un comando que intenta ejecutarse ["app",o algo similar, la cadena json no fue analizada por Docker y Linux está tratando de usar un shell para analizar el comando como una cadena. Esto también puede suceder si ordena mal los argumentos, por ejemplo, intentar ejecutar -ites una señal de que intentó colocar banderas después del nombre de la imagen cuando deben colocarse antes del nombre de la imagen.

Con los scripts de shell, este error aparece si la primera línea con los #!puntos a un comando que no existe dentro del contenedor. Para algunos, esto es intentar ejecutarse bashen una imagen que solo tiene /bin/sh. Y en su caso, esto puede ser desde los avances de línea de Windows en el script. Cambiar a los avances de línea de Linux / Unix en su editor corregirá eso.

Con los binarios, este error aparece si falta una biblioteca vinculada. He visto esto a menudo cuando los comandos de Go están compilados libc, pero se ejecutan en alpine con muslo en scratch sin ninguna biblioteca. Debe incluir todas las bibliotecas que faltan o compilar estáticamente su comando. Para ver estos enlaces de biblioteca, utilice ldd /your/appen su archivo binario.

BMitch
fuente
3
¡Gracias! Para mi aplicación go en la imagen de cero, tuve que reconstruir usando CGO_ENABLED = 0
Manuel Rony Gomes
Mi caso: 1. El binario ejecutable está construido a partir de alpine, pero la imagen base que ejecuta el comando go es debian, por lo que se produjo un error.
inix
4

Reemplazo de CRLF con LF usando Notepad ++

  1. La función Buscar / Reemplazar de Notepad ++ maneja este requisito bastante bien. Simplemente abra el diálogo Reemplazar (CTRL + H), seleccione el modo de búsqueda Extendida (ALT + X), busque "\ r \ n" y reemplace con "\ n":
  2. Presione Reemplazar todo (ALT + A)

Reconstruir y ejecutar la imagen de la ventana acoplable debería resolver su problema.

Rajesh Samson
fuente
4

No puedo comentar debido a mi representante, pero solo quería agregar: para los usuarios de VSCode , puede cambiar los finales de línea CRLF a LF haciendo clic en CRLF en la barra de estado, luego seleccione LF y guarde el archivo.

Tuve el mismo problema y esto lo resolvió. Pasos a seguir para VSCode

Xelron
fuente
3

Tenga en cuenta un error similar como:

standard_init_linux.go:211: exec user process caused "no such file or directory"

puede suceder si la arquitectura para la que se creó una imagen no coincide con la de su sistema. Por ejemplo, intentar ejecutar una imagen creada arm64en una x86_64máquina puede generar este error.

Bajo
fuente
1
Gracias por escribir eso. Me hizo darme cuenta de que estaba construyendo con ubuntu y correr con alpine y alpine presumiblemente faltaba algo necesario.
Kip
1

Agregue esto a su Dockerfile

RUN cat /run.sh | tr -d '\r' > /run.sh
José Boretto Blengino
fuente
0

Resolví este problema estableciendo mi configuración en vscode.

  1. Archivo
    1. Preferencias
      1. Configuraciones
        1. Editor de texto
          1. Archivos
          2. Eol - establecido en \ n

Saludos

Deusimar Ferreira
fuente