🦭
【Podman】Goのビルドをコンテナ内で実行する
方針
- ローカルに開発環境を用意することなくGoのビルドを行う
- Goのインストール済みコンテナイメージを使用する
- コンテナの実行ツールにはPodmanを使用する
- Podmanの実行は一般ユーザーでルートレスモードで行う
- コンテナ内にホストOS上のディレクトリをマウントし、ビルドしたバイナリはそこへ保存する
使用するコンテナイメージについて
使用するGoのコンテナイメージは、Docker公式のものを使用。
(Docker公式イメージについては下記記事を参照)
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 8月 19 02:29 go.mod
-rwxr-xr-x. 1 user user 1766198 8月 19 02:32 hello
-rw-rw-r--. 1 user user 76 8月 18 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
参考
- Golang - Official Image | Docker Hub
- Tutorial: Get started with Go - The Go Programming Language
- How to Write Go Code - The Go Programming Language
- New module changes in Go 1.16 - The Go Blog
- How SELinux separates containers using Multi-Level Security
- Docker公式イメージとは? - What are Docker Official Images? - あとがきのようなもの
Discussion