修士の研究

netlifyのbuild-imageでnodeがインストールできなかった話

はじめに

修士の研究のため、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もちゃんとインストールできるようになる。

そーたの技術ブログ

コメント

タイトルとURLをコピーしました