14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

alpineイメージのDockerfileに、Goをinstallしたい場合にハマったこと

Last updated at Posted at 2019-09-12

image.png

by Renée French CC BY 3.0

はじめに

こんにちわ。Wano株式会社エンジニアのnariと申します。
今回は、alpineイメージにGoをインストールする際にはまった事案について備忘録を残したいと思います。

TL;DR

  • alpineベースのイメージにGoをインストールしたいなら、wgetとかcurlとか使わずにapkを使おう

今回やりたいこと

  • codebuild(CI)上でhashicorp/terraformイメージにて、apexコマンドでlambdaを自動デプロイしたい
  • そのため今回は、lambdaをGo言語で書いていたためhookのbuildにGoのコンパイル環境が必要なので、hashicorp/terraformイメージに追加でGoをインストールする必要がある

問題

  • hashicorp/terraformはalpineベース そこにGoをcodebuildのbuildspec.ymlにて以下のようにインストールしようとした
export GO_VERSION=1.12.4
wget https://storage.googleapis.com/golang/go{GO_VERSION}.linux-amd64.tar.gz
tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

すると、go version実行時に、以下のようなエラーがでた

sh: go: not found

エラー解決策

With Alpine, you have libmusl instead of glibc. Alpine's libmusl is not a 1 for 1 replacement. Code linked against glibc will show a not found error which is actually from the dynamic linker. You can see what libraries are linked to the binary with ldd:

どうやら、glibcの代わりに入っているlibmusl(linux標準のCライブラリ)の挙動が異なるようです。

 # ldd /usr/local/go/bin/go
        /lib64/ld-linux-x86-64.so.2 (0x7f63ceed1000)
        libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f63ceed1000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f63ceed1000)

なるほど、/lib64/ld-linux-x86-64.so.2 がalpineにはないので、そこへのdynamic linkを有する/usr/local/go/bin/goは、not found errorを返しちゃうわけですね

このかたは、Goバイナリを実行する形(go自体のダウンロードをしない)にするか、glibcを入れちゃうか(それならCentOSとかDebianつかえよ)って言ってるんですが、どちらの解決案も使わず以下のように解決しました。

apk add --update --no-cache vim git make musl-dev go curl

# Configure Go
export GOPATH=/root/go
export PATH=${GOPATH}/bin:/usr/local/go/bin:$PATH
export GOBIN=$GOROOT/bin
mkdir -p ${GOPATH}/src ${GOPATH}/bin
export GO111MODULE=on
go version

元も子もないapkでのdownload作戦、、、apkはやっぱ便利ですねというお話でした。

終わりに

既存のイメージに追加で環境を打ち込みたい際には、まずそのイメージのベースイメージを、dockerHubから辿ってDockerfileから確認するのが大事ですね。

Cライブラリ群の知識など全然ないなぁと痛感することになりましたが、今はStackOverflowなどにかなりニアリーなケースに陥っていた先人のケースがあってとても助かります。

こう言った付け焼き刃のソリューションだけでなく、どこかしらで深いところまでCライブラリの勉強などもしていきたいですね。

参考文献

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?