rktでAlpine Linuxのイメージを作る

こんな感じのスクリプトを作ってみました。 build-alpine.sh などとして保存しておきます。

#!/bin/bash
set -e

[ "x$ALPINE_VERSION" == "x" ] && ALPINE_VERSION="edge"

if [ "$EUID" -ne 0 ]; then
    echo "This script uses functionality which requires root privileges"
    exit 1
fi

acbuild --debug begin

acbuildEnd() {
    export EXIT=$?
    acbuild --debug end && exit $EXIT
}

trap acbuildEnd EXIT

acbuild --debug set-name alpine
acbuild --debug set-tag "${ALPINE_VERSION}"
acbuild --debug dep add quay.io/coreos/alpine-sh
acbuild --debug run -- sed -i 's/v[[:digit:]]\.[[:digit:]]/'"${ALPINE_VERSION}"'/' /etc/apk/repositories
acbuild --debug run apk update
acbuild --debug run -- apk add --upgrade apk-tools
acbuild --debug run -- apk upgrade --latest --available
acbuild --debug run -- rm -rf /var/cache/apk/*
acbuild --debug set-exec -- /bin/sh
acbuild --debug write --overwrite "alpine-${ALPINE_VERSION}-amd64.aci"

やっていることは見たまんまで、サンプルをほぼそのままです。 アレンジしているのはAlpine Linuxのバージョンを指定できるようにしているところで、デフォルトで edge を使います。

# edgeのイメージを作ります
sudo ./build-alpine.sh
# v3.7でイメージを作ります
sudo ALPINE_IMAGE=v3.7 ./build-alpine.sh

カレントディレクトリに alpine-v3.7-amd64.aci とかできていると思うので走らせてみます。シェルが動けばOKです。 exit でコンテナ(Pod) を抜けましょう。

sudo rkt run --insecure-options=image --interactive=true alpine-v3.7-amd64.aci

rktを操作してみる

Podの一覧を見るには rkt list を使います。

$ sudo rkt list
UUID        APP IMAGE NAME  STATE   CREATED     STARTED     NETWORKS
0cd9f129    alpine  alpine:v3.7 exited  7 seconds ago   7 seconds ago   

イメージの一覧を見てみます。 rkt image list をつかいます。

$ sudo rkt image list
ID          NAME                    SIZE    IMPORT TIME LAST USED
sha512-2222d0a86708 quay.io/coreos/alpine-sh:latest     5.4MiB  42 minutes ago  4 minutes ago
sha512-e50b77423452 coreos.com/rkt/stage1-coreos:1.29.0 211MiB  36 minutes ago  36 minutes ago
sha512-7f3037d4a34c alpine:v3.7             6.6MiB  15 seconds ago  15 seconds ago

Podとイメージを削除してみます。

# Podを消すときはUUIDを指定します。前方一致で絞り込めればいいようです。
$ sudo rkt rm 0cd9
"0cd9f129-69d1-42be-9663-4668a4895cdc"

$ sudo rkt list
UUID    APP IMAGE NAME  STATE   CREATED STARTED NETWORKS

# イメージを消すときは ID か NAME を指定します。 IDは前方一致で絞り込めればいいようです
$ sudo rkt image rm sha512-7f
successfully removed aci for image: "sha512-7f3037d4a34c66a0929595a8a46afa5b3364cf84e218aa0305bcfdfe8b95d863"
rm: 1 image(s) successfully removed

$ sudo rkt image list
ID          NAME                    SIZE    IMPORT TIME LAST USED
sha512-2222d0a86708 quay.io/coreos/alpine-sh:latest     5.4MiB  49 minutes ago  12 minutes ago
sha512-e50b77423452 coreos.com/rkt/stage1-coreos:1.29.0 211MiB  43 minutes ago  43 minutes ago

さきほど作ったACIを、走らせずに取り込んでみます。

$ sudo rkt fetch --insecure-options=image alpine-v3.7-amd64.aci 
sha512-7f3037d4a34c66a0929595a8a46afa5b

$ sudo rkt image list
ID          NAME                    SIZE    IMPORT TIME LAST USED
sha512-2222d0a86708 quay.io/coreos/alpine-sh:latest     5.4MiB  51 minutes ago  14 minutes ago
sha512-e50b77423452 coreos.com/rkt/stage1-coreos:1.29.0 211MiB  45 minutes ago  45 minutes ago
sha512-7f3037d4a34c alpine:v3.7             6.6MiB  5 seconds ago   5 seconds ago

取り込んだACI alpine:v3.7 をつかって色々やってみます。ちなみに、ctrl + ] を 3回叩くとコンテナをKILLできます。

$ sudo rkt run --interactive=true alpine:v3.7 --name=alpine-sh
/ # Container rkt-108f0bef-5d73-4458-85ec-b2407ad8acd3 terminated by signal KILL.
$ sudo rkt list
UUID        APP     IMAGE NAME  STATE   CREATED     STARTED     NETWORKS
108f0bef    alpine-sh   alpine:v3.7 exited  51 seconds ago  51 seconds ago  

$ # 実行するコマンドを変えてみます
$ sudo rkt run --interactive=true alpine:v3.7 --name=alpine-ls --exec="ls"
bin      dev      etc      home     lib      linuxrc  media    mnt      proc     root     run      sbin     srv      sys      tmp      usr      var
$ sudo rkt list
UUID        APP     IMAGE NAME  STATE   CREATED     STARTED     NETWORKS
108f0bef    alpine-sh   alpine:v3.7 exited  1 minute ago    1 minute ago    
9e3ed729    alpine-ls   alpine:v3.7 exited  29 seconds ago  29 seconds ago  

$ # デフォルトのコマンド /bin/sh にオプションを渡すときは `--` を前置きしてあげます
$ sudo rkt run --interactive=true alpine:v3.7 --name=alpine-ls2 -- -c 'ls'
bin      dev      etc      home     lib      linuxrc  media    mnt      proc     root     run      sbin     srv      sys      tmp      usr      var
$ sudo rkt list
UUID        APP     IMAGE NAME  STATE   CREATED     STARTED     NETWORKS
108f0bef    alpine-sh   alpine:v3.7 exited  2 minutes ago   2 minutes ago   
9e3ed729    alpine-ls   alpine:v3.7 exited  1 minute ago    1 minute ago    
efe730a1    alpine-ls2  alpine:v3.7 exited  5 seconds ago   5 seconds ago