linux - library - golang docker
Installed Go binary no encontrado en la ruta en Alpine Linux Docker (5)
Tengo un binario Go que intento ejecutar en la imagen Alpine Docker.
Esto funciona bien para el binario Docker Go.
docker run -it alpine:3.3 sh
apk add --no-cache curl
DOCKER_BUCKET=get.docker.com
DOCKER_VERSION=1.9.1
curl -fSL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-$DOCKER_VERSION" -o /usr/local/bin/docker
chmod +x /usr/local/bin/docker
docker help
Usage: docker [OPTIONS] COMMAND [arg...]
...
Sin embargo, para el binario Go, quiero instalarlo.
RACK_BUCKET=ec4a542dbf90c03b9f75-b342aba65414ad802720b41e8159cf45.ssl.cf5.rackcdn.com
RACK_VERSION=1.1.0-beta1
curl -fSL "https://${RACK_BUCKET}/${RACK_VERSION}/Linux/amd64/rack" -o /usr/local/bin/rack
chmod +x /usr/local/bin/rack
rack help
sh: rack: not found
/usr/local/bin/rack help
sh: /usr/local/bin/rack: not found
ls -al /usr/local/bin/
total 43375
drwxr-xr-x 2 root root 1024 Jan 11 18:10 .
drwxr-xr-x 8 root root 1024 Jan 11 18:09 ..
-rwxr-xr-x 1 root root 30222575 Jan 11 18:09 docker
-rwxr-xr-x 1 root root 14190576 Jan 11 18:10 rack
which rack
/usr/local/bin/rack
Pensé que podría tener algo que ver con esta respuesta, pero no obtengo el mismo error cuando ldd
.
ldd /usr/local/bin/rack
/lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)
¿Alguna idea con este binario de Go instalado no se encuentra en la ruta de Alpine Linux Docker?
Al construir bajo Debian 9 (Stretch) / Go 1.10.2 y ejecutarse bajo Alpine 3.7.0:
CGO_ENABLED=0 go build
Ni GOOS=linux
ni GOARCH=amd6
fueron necesarios.
Alternativamente, puede (mientras tanto) utilizar la imagen golang:alpine
de Docker Hub para compilar y ejecutar su código.
docker run -v ${YOUR_CODE_PATH}:/go/src/example -it golang:alpine sh
cd src/example
go build .
ldd example
/lib/ld-musl-x86_64.so.1 (0x7f677fcf7000)
libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f677fcf7000)
Dependiendo de la naturaleza del programa, es posible que desee compilar su programa go con las opciones de enlace estático, como las siguientes:
-x -a -tags netgo -installsuffix netgo
Después, no necesita preocuparse por vincular las bibliotecas correctas.
He compilado ir binario en alpino con estas opciones
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o [name of binary]
Funcionó.
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
Como el musl y el glibc son compatibles, puedes hacer este enlace simbólico y arreglará la dependencia faltante.