困ったこと
git操作を行えるdocker imageを作ろうと思い、Alpine Linuxイメージにgit, hubをインストールしようとしていました。
gitのインストールはパッケージを使えば簡単ですが、pull requestを作るために必要なhubは、安定して使えるパッケージがないので、バイナリファイルをインストールして使おうとしました。
hubを入れてhubコマンドを実行するとhub: not found
とエラーが出てしまいました。
FROM alpine:latest
RUN apk update && apk add git bash wget
RUN wget https://github.com/github/hub/releases/download/v2.12.8/hub-linux-amd64-2.12.8.tgz && \
tar xzf hub-linux-amd64-2.12.8.tgz && \
mv hub-linux-amd64-2.12.8/bin/hub usr/local/bin/ && \
rm hub-linux-amd64-2.12.8.tgz && \
rm -r hub-linux-amd64-2.12.8
which -a hub
usr/local/bin/hub
hub
bin/sh: hub: not found
原因
(まだ理解が浅いのですが)Alpine Linuxではglibcではなく、musl-libcを使っているため、バイナリファイルをインストールして使おうとしたときに、うまく動いてくれないことがあるようです。
結論
以下3つの解決策があります。
1. パッケージが用意されているDebianやUbuntuを使う。
私はこのイメージを業務で使いたかったので、パッケージをインストールすれば使えるかつ、安定していそうな、この方法を選びました。 デメリットはAlpine Linuxイメージを使う場合よりもイメージが重たくなることです。
FROM debian:latest
RUN apt update && apt install -y git hub
2. edgeバージョンのhubパッケージをインストールする。
edgeバージョンでしたらhubのパッケージがありますので、これをインストールして使用します。
https://pkgs.alpinelinux.org/packages?name=hub
※なお、edgeバージョンは開発中で安定していないため、本番環境には適しません。
FROM alpine:latest
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk update && apk add git hub bash
3.シンボリックリンクを張る。
libc6-compat
というパッケージをインストールするとシンボリックリンクが張られ、hubコマンドを使えるようになりました。
FROM alpine:latest
RUN apk update && apk add git bash wget libc6-compat
RUN wget https://github.com/github/hub/releases/download/v2.12.8/hub-linux-amd64-2.12.8.tgz && \
tar xzf hub-linux-amd64-2.12.8.tgz && \
mv hub-linux-amd64-2.12.8/bin/hub usr/local/bin/ && \
rm hub-linux-amd64-2.12.8.tgz && \
rm -r hub-linux-amd64-2.12.8
まとめ
安定して動いて欲しい場合は、1の方法が良さそうです。
趣味など不安定でも良い場合は、2か3の方法で良いと思います。
参照
Problem with the linux binaries on Alpine #1818
Alpine Linux で適当なバイナリを持ってきて動かす備忘録
glibc がリンクされた binary を alpine 上で動かしたい