J'ai un binaire Go que j'essaie d'exécuter sur l'image Alpine Docker.
Cela fonctionne très bien pour le binaire 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...]
...
Cependant, pour le binaire Go, je veux installer.
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
J'ai pensé que cela pourrait avoir quelque chose à voir avec cette réponse mais je n'ai pas la même erreur lors de l'exécution de 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)
Aucune idée avec ce binaire Go installé ne se trouve dans le chemin sur Alpine Linux Docker?
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
Puisque le musl et la glibc sont donc compatibles, vous pouvez créer ce lien symbolique et cela corrigera la dépendance manquante.
J'ai compilé go binary en Alpine avec ces options
GOOS=linux GOARCH=AMD64 CGO_ENABLED=0 go build -o [name of binary]
Ça a marché.
Lors de la construction sous Debian 9 (Stretch)/Go 1.10.2 et sous Alpine 3.7.0:
CGO_ENABLED=0 go build
Ni GOOS=linux
ni GOARCH=AMD6
était nécessaire.
Selon la nature du programme, vous souhaiterez peut-être compiler votre programme go avec des options de liens statiques, telles que les suivantes:
-x -a -tags netgo -installsuffix netgo
Ensuite, vous n'avez pas à vous soucier de lier les bonnes bibliothèques.
Alternativement, vous pouvez (pendant ce temps) utiliser le golang:Alpine
image de Docker Hub pour compiler et exécuter votre code.
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)