【Docker】alpineではシェルスクリプトで配列を扱えない

タイトルにDockerと書いていますが、どちらかというとalpineディストリビューションのお話。

最近Dockerを使い始めました。Dockerを使用しているときに嵌ったことがあったのでご紹介。

Docker自体の紹介や環境構築に関しては別の記事をあげる予定です。

alpineとは?

alpineとはlinuxディストリビューションの1つで軽量であることが最大の特徴です。軽量であることを生かしてコンテナイメージとしてよく用いられます。

alpineの標準はbashではない?

bashは現在一番使用されているシェルだと思います。CentOSやUbuntuなどでもbashが使用されていますよね。

しかしながら、alpineではbashはサポートされていません。代わりに使用できるのが「ash」というシェルです。基本的にはsh拡張のシェルなので、そこまで大きな違いはないのですが微妙な違いに困ることがあります。

ashでは配列が使用できない?

実はashでは配列が使用できません。配列を使用すると挙動がおかしくなります。

alpine上で以下のようなシェルを書きます。

# 引数を受け取る
ARGS=${@:1:99}
AA=$1
BB=$2
CC=$3

# 引数の内容を出力
echo ARGS=$ARGS
echo AA=$AA
echo BB=$BB
echo CC=$CC

# 引数の文字数を出力
echo $ARGS | wc -c
echo $AA | wc -c
echo $BB | wc -c
echo $CC | wc -c

最初の行で引数を配列として受け取っています。それ以外の行は引数をそのまま受け取っています。(比較用)

このシェルに引数を与えて以下のように実行します。

 sh test.sh aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

最初の引数がaを20文字、2番目がbを30文字、3番目がcを80文字です。そうすると実行結果が以下のようになります。

ARGS=aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccccccccccccccc
ccccccccccc
AA=aaaaaaaaaaaaaaaaaaaa
BB=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
CC=cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
100
21
31
81

ARGSが100文字で切れてしまっています。配列にしてしまうとこうなってしまうようです。(ちなみに引数が短い状態だと普通に動いてしまいます…)

最後に

上の問題は実際に仕事中に起こったものです。原因が全然分からず、解決までにだいぶ時間がかかってしまいました。

皆さんもお気をつけください。