🦭

【Podman】Goのビルドをコンテナ内で実行する

2021/08/19に公開

方針

  • ローカルに開発環境を用意することなくGoのビルドを行う
  • Goのインストール済みコンテナイメージを使用する
  • コンテナの実行ツールにはPodmanを使用する
  • Podmanの実行は一般ユーザーでルートレスモードで行う
  • コンテナ内にホストOS上のディレクトリをマウントし、ビルドしたバイナリはそこへ保存する

使用するコンテナイメージについて

使用するGoのコンテナイメージは、Docker公式のものを使用。
(Docker公式イメージについては下記記事を参照)
https://tnk4on.hatenablog.com/entry/2021/08/18/030000

Golang - Docker公式イメージ

  • Golang - Official Image | Docker Hub
    • Docker Official Image。メンテナンスはDockerコミュニティが実施。
    • ベースイメージ: 無印[golang:<version>]のベースイメージはDebian。他にalpine版[golang:<version>-alpine]、Windows Server Core版[golang:<version>-windowsservercore]がある。
    • Go version: v.1.17.0(現時点でのlatestタグ)

コンテナ内でビルドする方法

Docker HubのGolangの解説を参考にする。ただし、Dockerコマンドを使用する前提で記載されているのでPodman向けに修正する。実行するサンプル(hello.go)はGo公式のチュートリアルに記載のものを使用。

hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
ビルド
$ mkdir hello; cd hello
$ vi hello.go
$ podman pull docker.io/library/golang
$ podman run --rm -v .:/hello:z -w /hello golang go mod init hello
$ podman run --rm -v .:/hello:z -w /hello golang go build
  • vi hello.go時に上記サンプルの内容をコピペする
  • podman pullによる事前のイメージ取得は、代わりにpodman runと同時でも良い
  • Go 1.16以降、モジュール使用がデフォルトでオンになったのでgo mod initをしてgo.modの作成が必要
動作確認
$ ls -l
合計 1736
-rw-r--r--. 1 user user      22  819 02:29 go.mod
-rwxr-xr-x. 1 user user 1766198  819 02:32 hello
-rw-rw-r--. 1 user user      76  818 03:26 hello.go
$ ./hello
Hello, World!

(補足)podman runの実行オプションについて

  • -v .:/hello:z:カレントディレクトリをコンテナ内の/helloにマウント。:zオプションでSELinuxコンテキストの修正。
  • -w /hello:コンテナ内に/helloを作成しWORKDIRとして指定する。

動作確認環境

  • RHEL 8.4
$ uname -a
Linux rhel84 4.18.0-305.12.1.el8_4.x86_64 #1 SMP Mon Jul 26 08:06:24 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux
$ podman version
Version:      3.2.3
API Version:  3.2.3
Go Version:   go1.15.7
Built:        Tue Jul 27 16:29:39 2021
OS/Arch:      linux/amd64
  • CentOS Stream 8
$ uname -a
Linux phenex 4.18.0-331.el8.x86_64 #1 SMP Thu Aug 19 16:49:03 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ podman version
Version:      3.3.0-dev
API Version:  3.3.0-dev
Go Version:   go1.16.6
Built:        Thu Aug 19 07:44:02 2021
OS/Arch:      linux/amd64
  • Fedora 34
$ uname -a
Linux fedora34 5.13.10-200.fc34.x86_64 #1 SMP Fri Aug 13 20:13:23 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ podman version
Version:      3.3.0-rc3
API Version:  3.3.0-rc3
Go Version:   go1.16.6
Built:        Wed Aug 18 05:35:00 2021
OS/Arch:      linux/amd64

参考

Discussion