はじめに
修士の研究のため、Netlifyのbuild-imageを使おうとしたけど、READMEの通りやってもうまくいかなかったのでメモ
やりたいこと
ここのREADMEのSTEP1, 2, 3がしたい。
現象
STEP1, 2は普通にできる。しかし、STEP3の
/opt/build-bin/build npm run build
をするとこんな感じでエラーがでる。なんかnodeがインストールできないっぽい。
buildbot@e759adb8d766:/$ ./opt/build-bin/build
Cloning into '/opt/buildhome/repo'...
done.
Installing dependencies
Python version set to 2.7
Version '12.18.0' not found - try `nvm ls-remote` to browse available versions.
Failed to install node version '12.18.0'
buildbot@e759adb8d766:/$
対処までの道のり
対処法だけくれ!って人はスキップ
実行しているファイル
今回実行しているファイルはコマンドの通り、/opt/build-bin/build
ただ、このファイルはコンテナを起動する時にローカルからマウントしているファイルです。
その証拠はSTEP2でコンテナを起動するときの/.test-tools/start-image.shに書いてあります。
start-image.sh (一部抜粋)
docker run --rm -t -i \
-e NODE_VERSION \
-e NPM_VERSION \
-e RUBY_VERSION \
-e YARN_VERSION \
-e HUGO_VERSION \
-e PHP_VERSION \
-e GO_VERSION \
-e SWIFT_VERSION \
-e PYTHON_VERSION \
-v ${REPO_PATH}:/opt/repo \
-v ${BASE_PATH}/run-build.sh:/opt/build-bin/build \
-v ${BASE_PATH}/run-build-functions.sh:/opt/build-bin/run-build-functions.sh \
$NETLIFY_IMAGE /bin/bash
docker run のvオプションで${BASE_PATH}/run-build.shを/opt/build-bin/buildにマウントしていることがわかる。
よってrun-build.shをみれば良さそう。
run-build.sh でやってること
#!/bin/bash
dir="$(dirname "$0")"
: ${NETLIFY_REPO_URL="/opt/repo"}
NETLIFY_BUILD_BASE="/opt/buildhome"
cmd=$*
BUILD_COMMAND_PARSER=$(cat <<EOF
$cmd
EOF
)
. "$dir/run-build-functions.sh"
if [[ ! -d $NETLIFY_REPO_DIR ]]; then
git clone $NETLIFY_REPO_URL $NETLIFY_REPO_DIR
fi
cd $NETLIFY_REPO_DIR
: ${NODE_VERSION="12.18.0"}
: ${RUBY_VERSION="2.7.1"}
: ${YARN_VERSION="1.22.4"}
: ${PHP_VERSION="5.6"}
: ${GO_VERSION="1.14.4"}
: ${SWIFT_VERSION="5.2"}
: ${PYTHON_VERSION="2.7"}
echo "Installing dependencies"
install_dependencies $NODE_VERSION $RUBY_VERSION $YARN_VERSION $PHP_VERSION $GO_VERSION $SWIFT_VERSION $PYTHON_VERSION
echo "Installing missing commands"
install_missing_commands
echo "Verify run directory"
set_go_import_path
echo "Executing user command: $cmd"
eval "$cmd"
CODE=$?
exit $CODE
おもにインストールをやってるっぽい。具体的にはinstall_dependenciesでインストールしている。
install_dependenciesは既存の関数ではなく、. "$dir/run-build-functions.sh"
で定義した関数なのでrun-build-functions.shをみる。
run-build-functions.sh (一部抜粋)
if nvm install --no-progress $NODE_VERSION
then
NODE_VERSION=$(nvm current)
# no echo needed because nvm does that for us
export NODE_VERSION=$NODE_VERSION
if [ "$NODE_VERSION" == "none" ]
then
nvm debug
env
fi
else
echo "Failed to install node version '$NODE_VERSION'"
exit 1
fi
多分ここだ。エラー文のFailed to ~もあるし。
nvm install でインストールして失敗してるんだな。なんでだろ。
エラーログに nvm ls-remoteしてみてって言われてたから、付け加えてみるか。
変更後 run-build-functions.sh (一部抜粋)
nvm ls-remote <-NEW!!
if nvm install --no-progress $NODE_VERSION
then
NODE_VERSION=$(nvm current)
# no echo needed because nvm does that for us
export NODE_VERSION=$NODE_VERSION
if [ "$NODE_VERSION" == "none" ]
then
nvm debug
env
fi
else
echo "Failed to install node version '$NODE_VERSION'"
exit 1
fi
これでSTEP2, 3 をやってみた。
結果
buildbot@db733d62c389:/$ /opt/build-bin/build
Cloning into '/opt/buildhome/repo'...
done.
Installing dependencies
Python version set to 2.7
N/A
Version '12.18.0' not found - try `nvm ls-remote` to browse available versions.
Failed to install node version '12.18.0'
buildbot@db733d62c389:/$
N/A … N/A !?
コンテナのDNS
N/Aってことはコンテナ内から通信できてないってことか?
通信できているか確認のため、curlをしてみた。
buildbot@db733d62c389:/$ curl google.com
curl: (6) Could not resolve host: google.com
buildbot@db733d62c389:/$
DNSが設定できて無いじゃん多分。
前も似たようなことがあったのでピンときた。
よってコンテナのDNSを指定すればいいことがわかった。
対処法
test-tools/start-image.shにresolv.confマウントを追加する
docker run --rm -t -i \
-e NODE_VERSION \
-e NPM_VERSION \
-e RUBY_VERSION \
-e YARN_VERSION \
-e HUGO_VERSION \
-e PHP_VERSION \
-e GO_VERSION \
-e SWIFT_VERSION \
-e PYTHON_VERSION \
-v ${REPO_PATH}:/opt/repo \
-v ${BASE_PATH}/run-build.sh:/opt/build-bin/build \
-v ${BASE_PATH}/run-build-functions.sh:/opt/build-bin/run-build-functions.sh \
-v /etc/resolv.conf:/etc/resolv.conf \ <- NEW!!
$NETLIFY_IMAGE /bin/bash
ローカルのresolv.confをコンテナ内にもマウントすることでコンテナもローカルと同じDNSを使えるようになる。これでcurl も問題なく動くようになるし、nodeもちゃんとインストールできるようになる。
コメント