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

Respuestas:


149

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


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)


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í.


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


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


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

¡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.


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.


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


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.


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.