Não é possível executar o arquivo de script no docker, nenhum arquivo ou diretório

2

Eu tenho um Dockerfile assim:

FROM alpine

COPY setup.sh /setup.sh

CMD ["/setup.sh"]

Meu setup.sh é assim:

#!/bin/sh

echo "hello world"

Tentou executar estes comandos:

docker build .
docker run --name test 61230f9f45ad

Erro retornado é este:

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

Estou usando o Powershell no Windows 10 LTSB, a versão do docker é 17.12.0-ce, build c97c6d6 . Por quê?

    
por Cris 25.03.2018 / 18:54

2 respostas

3

Provavelmente, são os finais de linha no estilo Windows que o quebram. Aqui está o que o arquivo se parece quando salvo com finais de linha do Windows, mas leia no estilo Unix:

#!/bin/sh^M
^M
echo "hello world"^M 

Ao interpretar o shebang (#!), exec verá um retorno de carro extra (denotado CR , \r , ^M ) e não encontrará /bin/sh^M :

$ exec ./setup.sh
bash: setup.sh: /bin/sh^M: bad interpreter: No such file or directory 

Salve o arquivo com finais de linha no estilo Unix. No Windows, editores de texto decentes (Sublime Text, Notepad ++, qualquer IDE, etc.) devem ser capazes de fazê-lo. Há também uma ferramenta de linha de comando simples chamada dos2unix, que faz exatamente o que você espera.

    
por 25.03.2018 / 19:40
0

A imagem Alpine usa busybox e não há shell no busybox , uma vez que não é realmente destinado a humanos.

Para sua informação, substitua

CMD ["/setup.sh"]

por:

CMD /bin/busybox ls -al /bin

Você recebe:

lrwxrwxrwx    1 root     root            12 Jan  9 19:37 ash -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 base64 -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 bbconfig -> /bin/busybox
-rwxr-xr-x    1 root     root        805024 Dec 12 10:42 busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 cat -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chgrp -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chmod -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chown -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 conspy -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 cp -> /bin/busybox

[... snip ...]

lrwxrwxrwx    1 root     root            12 Jan  9 19:37 tar -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 touch -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 true -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 umount -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 uname -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 usleep -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 watch -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 zcat -> /bin/busybox

Além disso, se você olhar para /lib da mesma maneira, verá que as bibliotecas usuais não estão lá, pois busybox usa musl em vez de glibc .

Normalmente, o que for feito no seu setup.sh deve ser feito com instruções RUN no Dockerfile, de qualquer maneira?

PS: Incidentalmente,

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

significa que o executável não foi encontrado ou que uma das bibliotecas necessárias não foi encontrada, o que dificulta a depuração do Dockerfile.

    
por 25.03.2018 / 19:55

Tags