🇧🇷 Adicionando sh no container scratch

Primeiro post do ano, espero manter alguma frequência. Também quero testar esse formato de dicas curtas e rápidas.

Se você chegou aqui assumo que já criou imagens docker assim:(O binário é uma api em Go só para termos algo para testar(o código pode ser visto aqui).

FROM scratch
COPY ./server
ENV PORT ":9000"
ENTRYPOINT ["./server"]
#docker run --name api -d -e PORT=":9090" my-post
b55a52ec13c5d1a282b28a9f1ff6ed3773d86624232dc2151631e869fb4081ce

Digamos que você tem o container rodando e não está funcionando por algum motivo e você quer olhar a variável de ambiente, se ela está definida ou algum outro comando, talvez ls para ver que o binário server está lá realmente (Estou fazendo um exemplo bem simples mas tenho certeza que você pegou a idéia).

 docker-scratch-post docker exec -it api env
OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"env\": executable file not found in $PATH": unknown
➜  docker-scratch-post docker exec -it api ls
OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"ls\": executable file not found in $PATH": unknown

Aqui vem o problema e pode se resolvido de 2 maneiras.
A primeira poderia ser você trocar a image base e recriar o image e assim executar um novo container. Essa solução funciona mas precisa desse novo build e se por algum motivo não for uma opção para ti vamos para a segunda opção.

FROM alpine

A segunda é rodar um container com busybox e copiar o binário e mandar para o outro container que está em execução.

# docker run -d --name busybox --rm busybox:latest sleep 100   
# docker cp busybox:/bin/busybox .  

Aqui se você olhar no diretório atual deverá ver que há um binário chamado busybox. A próxima fase é copiar o binário no outro container que temos server rodando.

# docker cp ./busybox api:/busybox

Pronto agora precisamos rodar esse comando para adicionar o busybox no PATH e instalar

# docker exec -it api /busybox sh -c '
export PATH="/busybin:$PATH"
/busybox mkdir /busybin
/busybox --install /busybin
sh'

Executando esse comando você já vai acessar o container e poderá executar os comandos que precisar.

/ # ls
busybin  busybox  dev      etc      proc     server   sys
/ # env
HOSTNAME=b55a52ec13c5
SHLVL=2
PORT=:9090
HOME=/
TERM=xterm
PATH=/busybin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
/ #

Bom era isso que tinha para fazer hoje, espero que tenham gostado e que te ajude de alguma forma =)

comments powered by Disqus