🎃

dockerコンテナ内でVPN繋いで git clone して npm ci してビルドしてデプロイする

2021/01/28に公開

こんなことがやりたい

JavaScript/node.js のプロジェクトの CI を行うための docker コンテナを作りたい。

  1. 社内用 npm registry にアクセスするために VPN1 に接続する
  2. ソースコードを git clone で取得
  3. npm ci する
  4. VPN1 から切断
  5. デプロイに必要な VPN2 に接続する
  6. npm run build_and_deploy する
  7. VPN2 から切断

I. docker イメージの取得

CircleCI が提供している便利な Docker イメージを使わせていただく。

docker pull circleci/node:12

II. コンテナ起動

docker run --privileged -it ubuntu -v /c/my/ovpn/dir:work/ /bin/bash

c:\my\ovpn\dir.ovpn ファイルがある前提。
--privileged を付けないと tun なんとかでエラーが出る。

VPN接続時のuser/passを自動指定する

を参考に。ただし auth-user-pass <path>/auth.txt の path は openvpn 実行時のディレクトリが基準となる。

とりあえずパスなしで .ovpn ファイルと同じ c:\my\ovpn\dir に置いた。

III. openvpn インストール

sudo apt update
sudo apt install openvpn -y

IV. hosts 追加

なんか VPN で DNS がうまく効かなかった上に、Linux(このDockerイメージ) で DNS を追加する方法がよくわからなかったので原始的な hosts への追加で名前解決させる。

次のようなスクリプトを作って、

add_hosts.sh

#!/bin/sh
echo xxx.xxx.xxx.xxx my-npm-registry >> /etc/hosts

このファイルを c:\my\ovpn に置いておき、

sudo sh /work/add_hosts.sh

を実行。

V. openvpn 実行

pushd /work
sudo openvpn --config dev.ovpn --daemon
popd

--daemon を付けて常駐プログラムとして起動。

トラブルシューティングの時は --daemon は付けずに実行して、もう一つの Terminal で docker exec -i -t <container id> bash して試す。

ping my-npm-registry

が通れば VPN 接続は成功している。

VI. git clone

ssh で pull するので省略。

VII. VPN 切断

openvpn という名前のプロセスを雑に kill。

sudo pkill openvpn

Discussion