AlpineLinuxでnode

表題の通り。「nodeの公式のコンテナがDebianで、、」というのも見かけて、Alpineでもあるんじゃない?と思ったので確認する。

■ 環境

  • Docker for Mac 1.12.3
  • Mac OSX El Capitan

■ Docker Hub

library/node
https://hub.docker.com/r/library/node/

ここの”Tags“から見ると、”alpine“とついているコンテナも存在する。

■ Alpine Linux

コンテナを起動してパッケージを検索してみる。

$ docker run -ti --rm alpine sh
/ # 
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz
v3.4.6-9-g93fc63d [http://dl-cdn.alpinelinux.org/alpine/v3.4/main]
v3.4.6-5-g027d8ce [http://dl-cdn.alpinelinux.org/alpine/v3.4/community]
OK: 5975 distinct packages available
/ #
/ # apk search node
nodejs-lts-4.6.0-r0
nodejs-lts-doc-4.6.0-r0
perl-tree-dag_node-1.29-r0
nodejs-lts-dev-4.6.0-r0
sngtc_client-1.3.7-r1
nodejs-dev-6.7.0-r0
nodejs-doc-6.7.0-r0
nodejs-6.7.0-r0
perl-tree-dag_node-doc-1.29-r0
/ #

ありそうである。

以上。

AlpineLinuxでユーザにグループを追加

表題の通り。

■ 環境

  • Alpine Linux 3.4.1

■ グループの追加

vagrant“ユーザに”docker“グループを追加したい。`usermod`とか`moduser`といったあたりかと思ったのだが、そういったコマンドが見つけられない。とりあえず現状確認。

localhost:~# id vagrant
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
localhost:~#

`groups`というコマンドもあるようなので試してみる。

localhost:~# groups --help
BusyBox v1.24.2 (2016-06-23 08:49:16 GMT) multi-call binary.

Usage: groups [USER]

Print the group memberships of USER or for the current process
localhost:~#
localhost:~# groups vagrant
vagrant
localhost:~#

ということは`groupadd`もしくは`addgroup`といったコマンドがあるかと思い確認。

localhost:~# which groupadd
localhost:~# which addgroup
/usr/sbin/addgroup
localhost:~#

`addgroup`というコマンドがあったのでヘルプを確認する。

localhost:~# addgroup --help
BusyBox v1.24.2 (2016-06-23 08:49:16 GMT) multi-call binary.

Usage: addgroup [-g GID] [-S] [USER] GROUP

Add a group or add a user to a group

    -g GID    Group id
    -S    Create a system group
localhost:~#

では実際に追加してみる。

localhost:~# addgroup vagrant docker
localhost:~#
localhost:~# id vagrant
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),102(docker)
localhost:~#
localhost:~# groups vagrant
vagrant docker
localhost:~#

以上。

作成したVagrantBoxからvagrant up

表題の通り。先日の下記エントリの続きである。

VirtualBoxのVMからVagrantBoxを作成

■ 環境

  • Vagrant 1.8.1
  • Mac OSX El Capitan

■ alpine-3.4.1.box

先日のエントリの通り、下記boxファイルが作成されている。

$ ls -l
-rw-r--r--  1 withsin  staff  144878996  7  5 19:09 alpine-3.4.1.box
$

このboxファイルをvagrantで使用できるようにする。まずはboxに追加である。

$ vagrant box add withsin/alpine alpine-3.4.1.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'withsin/alpine' (v0) for provider:
    box: Unpacking necessary files from: file:///Users/withsin/work/alpine/alpine-3.4.1.box
==> box: Successfully added box 'withsin/alpine' (v0) for 'virtualbox'!
$

withsin/alpine“という名前で追加した。下記の通り確認できる。

$ vagrant box list
centos/7                  (virtualbox, 1603.01)
centos/atomic-host        (virtualbox, 7.20151101)
maier/alpine-3.3.1-x86_64 (virtualbox, 1.0.0)
ubuntu/vivid64            (virtualbox, 20160128.0.0)
withsin/alpine            (virtualbox, 0)
$

versionは特に指定していないので”0″になっているのであろう。この追加したboxで起動できるかを確認する。

■ vagrant up

$ vagrant init withsin/alpine
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
$
$ ls
Vagrantfile
$
$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://atlas.hashicorp.com/search.
  config.vm.box = "withsin/alpine"
  :
$

`init`は問題なくできたので、実際に`up`してみる。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'withsin/alpine'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: test_default_1467701682504_52757
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
The configured shell (config.ssh.shell) is invalid and unable
to properly execute commands. The most common cause for this is
using a shell that is unavailable on the system. Please verify
you're using the full path to the shell and that the shell is
executable by the SSH user.
$

エラーとなった。SSHでログインできないようである。VMは起動しているので停止させておく。

$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
$
$$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
$

SSH SETTINGS
https://www.vagrantup.com/docs/vagrantfile/ssh_settings.html

上記ドキュメントを確認すると、デフォルトでは”bash”が適用されるようだ。”Alpine Linux“のデフォルトシェルは”ash“であったはず。”bash“はインストールしなければいけなかったはず。というわけで”sh“を指定することにする。

config.ssh.shell = "sh"

上記をVagrantfileに記述して再度`up`する。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'withsin/alpine'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: test_default_1467702010684_99055
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default:
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
==> default: Mounting shared folders...
    default: /vagrant => /Users/withsin/work/test
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

mount: mounting vagrant on /vagrant failed: No such device

$

起動はしたが、”/vagrant“をマウントできないようだ。これは以前も見た記憶がある。今回はGuestAdditionsも入れていないので確かに起こりそうだ。一旦は今回は後回しにする。

$ vagrant ssh
Welcome to Alpine!
localhost:~$ cat /etc/alpine-release
3.4.1
localhost:~$

以上。

■ 関連

VirtualBoxのVMからVagrantBoxを作成

表題の通り。先日作成途中であったAlpine LinuxのVMをVagrantBoxにする。

■ 環境

  • Alpine Linux 3.4.1
  • Vagrant 1.8.1
  • VirtualBox
  • Mac OSX El Capitan

■ alpine

先日のエントリでは”3.3.3“を使用していたと記憶しているが、現在は”3.4.1“までリリースされていたので再度”3.4.1“でVirtualBoxのVMを作成しインストールした。

Alpine Linux on VirtualBox (1)
Alpine Linux on VirtualBox (2)

以降はインストールした後の作業について。

■ Vagrant Base Box

下記公式ドキュメントを参照し、最低限の作業を行う。

CREATING A BASE BOX
https://www.vagrantup.com/docs/boxes/base.html

  • vagrant user
  • key
  • sudo

VirtualBoxのVagrantBoxを作成するには更に下記のドキュメントがある。

https://www.vagrantup.com/docs/virtualbox/boxes.html

しかし、Alpine LinuxにVirtualBox Guest Additionsがインストールできなかったので、ここは諦めた。少なくとも前述の最低限の範囲ができていればVagrantBoxとして作成することは可能であろう。

■ VagrantBox

VagrantBox化するには下記のように行う。

vagrant package --base [VM] --output [VagrantBox]

自身の場合は下記のようにした。VirtualBoxのVMは”alpine“、出力するVagrantBoxの名前は”alpine-3.4.1.box“としている。

$ vagrant package --base alpine --output alpine-3.4.1.box

これで作成された”alpine-3.4.1.box“は下記のサイズになっていた。

$ ls -l alpine-3.4.1.box
-rw-r--r--  1 withsin  staff  144878996  7  5 19:09 alpine-3.4.1.box
$

この後はVagrantとして作成できるか?であるが、今回はここまでとする。

続きはこちら

以上。

■ 関連

インストール済みパッケージの違い

Alpine Linuxにおいて表題の件。自身でインストールしたものと、Vagrantで公開されているBox、Dockerの公式コンテナとで比べてみる。

■ 環境

  • Alpine Linux 3.3.3, 3.3.1
  • Docker 1.11.1
  • VirtualBox
  • Mac OSX

■ VirtualBox

下記はVirtualBoxでインストールしたAlpine Linuxのパッケージ一覧。後から追加したものはなかった気がするのだが確実ではない。

localhost:~# apk info | sort
acct
alpine-base
alpine-baselayout
alpine-conf
alpine-keys
apk-tools
blkid
busybox
busybox-initscripts
busybox-suid
chrony
cryptsetup-libs
device-mapper
e2fsprogs
e2fsprogs-libs
kmod
lddtree
libattr
libblkid
libc-utils
libcap
libcom_err
libcrypto1.0
libssl1.0
libuuid
linux-firmware
linux-grsec
mkinitfs
mtools
musl
musl-utils
openrc
openssh
openssh-client
openssh-sftp-server
scanelf
sudo
syslinux
xz-libs
zlib
localhost:~#

■ Vagrant

下記はVagrantで起動しているAlpine Linuxのパッケージ一覧。VagrantのBoxは”maier/alpine-3.3.1-x86_64″を利用させてもらっている。

alpine-331:~$ apk info | sort
acct
alpine-base
alpine-baselayout
alpine-conf
alpine-keys
apk-tools
bash
blkid
busybox
busybox-initscripts
busybox-suid
ca-certificates
cryptsetup-libs
curl
device-mapper
e2fsprogs
e2fsprogs-libs
kmod
lddtree
libblkid
libc-utils
libcom_err
libcrypto1.0
libssh2
libssl1.0
libuuid
linux-firmware
linux-grsec
mkinitfs
mtools
musl
musl-utils
ncurses-libs
ncurses-terminfo
ncurses-terminfo-base
openntpd
openrc
openssh
openssh-client
openssh-sftp-server
openssl
readline
scanelf
sudo
syslinux
xz-libs
zlib
alpine-331:~$

■ Docker

Dockerの公式コンテナ。

/ # apk info | sort
alpine-baselayout
alpine-keys
apk-tools
busybox
libc-utils
libcrypto1.0
libssl1.0
musl
musl-utils
scanelf
zlib
/ #

かなり少ない。これだけ絞っているから5MBというサイズを実現できているのであろう。

以上。

■ 関連