(下部に追記あり)
問題
DockerのDockerfileの中でRUNコマンドを使ってシェルスクリプトを実行しようとするとbad interpreter: Text file busy
が表示されることがある。
- Dockerfileの一部
# Installing Xymon
ADD ./xymon-4.3.21.tar.gz /usr/local/src/
WORKDIR /usr/local/src/xymon-4.3.21
RUN /bin/bash configure --server #ここで落ちる
RUN make
RUN make install
- 実行結果
configure: /usr/local/src/xymon-4.3.21/configure.server: /bin/sh: bad interpreter: Text file busy
configure: line 21: /usr/local/src/xymon-4.3.21/configure.server: Success
The command '/bin/sh -c /bin/bash configure --server' returned a non-zero code: 1
原因
ググると色々な原因があるみたいだけど、私の場合はファイルに実行権限を与えたのが良くなかったみたい。
対策
RUN chmod 755 sample.sh
RUN ./sample.sh
等でファイルに実行権限を与えた後はsyncコマンドを実行することでエラーを回避できる事がある。
RUN chmod 755 sample.sh
RUN sync #追加
RUN ./sample.sh
今回の場合はXymonのconfigureスクリプトの中で実行権限を変更していたのが原因。
#!/bin/sh
# Configuration script for Xymon.
# $Id: configure 7474 2014-09-28 09:39:28Z storner $
BASEDIR="`dirname $0`"
TARGET="$1"
if test "$TARGET" != ""; then shift; fi
# Make sure that all shell-scripts are executable.
# Subversion has a habit of exporting without the
# execute-bit set.
chmod 755 $BASEDIR/configure* $BASEDIR/build/*.sh $BASEDIR/client/*.sh #コレが原因
case "$TARGET" in
"--client")
exec $BASEDIR/configure.client $*
;;
(略)
こういう場合はsedでシェルスクリプトを書き換えてしまおう。
# Installing Xymon
ADD ./xymon-4.3.21.tar.gz /usr/local/src/
WORKDIR /usr/local/src/xymon-4.3.21
RUN sed -i -e '/^chmod 755/a sync' configure #chmod 755の後の行にsyncを挿入
RUN /bin/bash configure --server
RUN make
RUN make install
configureスクリプトは次のように書き換わるはず。
#!/bin/sh
# Configuration script for Xymon.
# $Id: configure 7474 2014-09-28 09:39:28Z storner $
BASEDIR="`dirname $0`"
TARGET="$1"
if test "$TARGET" != ""; then shift; fi
# Make sure that all shell-scripts are executable.
# Subversion has a habit of exporting without the
# execute-bit set.
chmod 755 $BASEDIR/configure* $BASEDIR/build/*.sh $BASEDIR/client/*.sh
sync
case "$TARGET" in
"--client")
exec $BASEDIR/configure.client $*
;;
(略)
これでうまく動作しました。
参考リンク
追記
DockerのStorage Driverがaufsの時に発生する現象のようです。devicemapper等に変更しましょう。
Docker Machineを使ってVirtualBoxに仮想マシンを作る時の例
$ docker-machine create --driver virtualbox --engine-storage-driver devicemapper develop