🎃
dockerコンテナ内でVPN繋いで git clone して npm ci してビルドしてデプロイする
こんなことがやりたい
JavaScript/node.js のプロジェクトの CI を行うための docker コンテナを作りたい。
- 社内用 npm registry にアクセスするために VPN1 に接続する
- ソースコードを
git clone
で取得 -
npm ci
する - VPN1 から切断
- デプロイに必要な VPN2 に接続する
-
npm run build_and_deploy
する - 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