Eu sou novo no Docker. Quero colocar em contêiner um ambiente pequeno para poder executar executáveis, mas estou preso porque não consigo nem executar um executável.
Minha estrutura de pastas é assim:
example/
|-Dockerfile
|-hello_world
Meu Dockerfile
fica assim:
# Use Alpine Linux as the base image
FROM alpine:latest
# Set the working directory inside the container
WORKDIR /app
# Copy the executable to the container
COPY hello_world /app/
# Set the permissions for the executable
RUN chmod +x /app/hello_world
# Define the command to run your server when the container starts
ENTRYPOINT ["/app/hello_world"]
Então eu corro:
> sudo docker build -t example .
> sudo docker run --name example_container example
O resultado disso é este:
exec /app/hello_world: no such file or directory
Eu tentei tantas variações quanto posso imaginar, tentando usar CMD
, RUN
e ENTRYPOINT
no Dockerfile mas todas tiveram o mesmo resultado da imagem não conseguir encontrar o programa hello_world na pasta app que existe na raiz.
Estou realmente confuso porque tentei isso no meu sistema operacional Ubuntu vanilla, coloquei uma pasta de teste na raiz e depois uma hello_world
lá, e pareceu funcionar bem, pois eu poderia executá-lo de qualquer lugar com esse caminho absoluto.
/app/hello_world
é um executável, é um trecho compilado de código Rust. Quando executo /app/hello_world
o shell na minha máquina Ubuntu, ele funciona bem.
conjunto de ferramentas stable-x86_64-unknown-linux-gnu/rustc 1.71.0
Alguém poderia me dizer o que estou fazendo de errado?
A razão pela qual você vê o erro “nenhum arquivo ou diretório” é porque o sistema está procurando o caminho incorporado na
.interp
seção do binário ELF. Para um binário compilado sob glibc, isso se parece com:Na sua imagem Alpine, não há
/lib64/ld-linux-x86-64.so.2
, o que leva à mensagem de erro.Usando um binário C como exemplo, se eu começar com:
E compile-o no meu sistema glibc e tente executá-lo no Alpine, vemos:
Se disponibilizarmos o intérprete esperado, assim:
Recebemos um novo erro:
Se disponibilizarmos a biblioteca compartilhada necessária:
Então o comando funciona conforme o esperado:
Com base nos comentários que recebi, aqui está uma resposta para quem deseja fazer isso com Rust e Alpine.
Conforme apontado, o problema surge ao tentar usar o padrão
x86_64-unknown-linux-gnu
para compilar o binário Rust. Em vez disso, compilex86_64-unknown-linux-musl
e use em particular:rustup target add x86_64-unknown-linux-musl
Seguido pela:
cargo build --release --target=x86_64-unknown-linux-musl
Em seguida, adicione este novo binário ao projeto em vez do antigo, e agora o Alpine irá executá-lo perfeitamente.