sedで、範囲指定してから、文字列置換を使う
sedで、範囲指定してから、文字列置換する方法を備忘録として残しておく。
例えば、以下のようなファイルがあるとする。
$ cat sample_http.conf <VirtualHost example.com:80> User www Group www Port 80 SSLDisable ServerAdmin admin@example.com ServerName example.com </VirtualHost> <VirtualHost example.com:443> User www Group www Port 443 SSLEnable ServerAdmin admin@example.com ServerName example.com </VirtualHost>
そして、ServerAdminをそれぞれ、
- HTTP
- http-admin@example.com
- HTTPS
- https-admin@example.com
に変更したい。
これをsedで、行うためには、こうする。
$ sed -i.bak -e '/<VirtualHost .*:80>/,/<\/VirtualHost>$/s|admin|http-admin|' sample_httpd.conf $ sed -i.bak -e '/<VirtualHost .*:443>/,/<\/VirtualHost>$/s|admin|http-admin|' sample_httpd.conf
実行すると思い通りの挙動になる。
<VirtualHost example.com:80> User www Group www Port 80 SSLDisable ServerAdmin http-admin@example.com ServerName example.com </VirtualHost> <VirtualHost example.com:443> User www Group www Port 443 SSLEnable ServerAdmin https-admin@example.com ServerName example.com </VirtualHost>
公式風に書くと、
sed -e '/範囲指定開始文字列/,/範囲指定終了文字列/s|置換前文字列|置換後文字列|'
ファイル
実際に実行したコマンドを簡単に見てみると、
$ sed -i.bak -e '/<VirtualHost .*:80>/,/<\/VirtualHost>$/s|admin|http-admin|' sample_httpd.conf
について、/<VirtualHost .*:80>/,/<\/VirtualHost>$/
で、
作業の範囲が、80番のVirtualHostディレクティブ内の内容であることを明示している。
続けて、置換の構文を s|admin|http-admin|
指定している。
Docker Machine にコマンドを追加する
MacOSで使う、 Docker Machine に、gcc、makeコマンド等を入れる方法を調べたので残す。
docker machineで、使われているOSは、TinyCoreLinuxというものらしい。
TinyCoreLinuxでは、tce-loadを使いパッケージをダウンロード、インストールすることができる。
例えば、gccの場合、以下のように使う。
$ docker-machine ssh dev $ tce-load -wi gcc.tcz Downloading: gcc.tcz Connecting to repo.tinycorelinux.net (89.22.99.37:80) gcc.tcz 93% |******************************************* | 23681k 0:00:24 ETgcc.tcz 99% 25431k 0:00:00 ETA gcc.tcz: OK $ which gcc /usr/local/bin/gcc
尚、入れられるパッケージは、以下のリストから探す。
TCZ Repository - Tiny Core Linux
gcc, make, cmake等はある。
参考
SeleniumサーバをDockerで構築する
SeleniumサーバをDockerコンテナとして構築する。
すでにGitHubにdocker-seleniumというプロジェクトが出ているが、
今回は日本語環境で利用したかったので、ゼロから作り直した。
使い方
$ git@github.com:kentatogashi/docker-selenium-ja.git $ cd docker-selenium-ja $ docker build -t 'kentatogashi/docker-selenium-ja' . $ docker run -dt -p 4444:4444 -p 5901:5901 kentatogashi/docker-selenium-ja
後記
デスクトップには、xfce4を使用していて、VNCでもつなぐことができる。
ちなみに、MacOSだと便利なことに、openコマンドで、簡単に立ち上げられる。
$ open vnc://selenium@192.168.99.100:5901
entrypointでは、vncserverの起動とXサーバを経由してSeleniumを起動する。
ただ、vncserver起動時にパスワードを対話形式で聞かれてしまうので、少しハマった。
結果的に、vncpasswdで、パスワードを事前に作成しておいて、それをコンテナに置くようにした。
Dockerfileには、こんな記述を書いた
# VNC Password RUN mkdir /root/.vnc ADD .vnc/passwd /root/.vnc/passwd RUN chmod 600 /root/.vnc/passwd
コマンドラインの結果をデスクトップに出力するために、 DISPLAYをきちんと指定が必要なのは初めて知った。
$ DISPLAY=:1 firefox
こうしておくと、デスクトップで開ける。
追記(2016/03/19)
Docker Hubに、登録したので、docker pull できる。
https://hub.docker.com/r/kentatogashi/docker-selenium-ja/
参考
DockerのUbuntu14.10の日本語化環境イメージを作成(Ubuntu) | BROKENDISH
CentOS/Ubuntu Linuxで、Oracle JDK 8をインストールしたDockerイメージを作る - CLOVER
作業用Bashスクリプトのテンプレート
よく自分で書く作業用Bashスクリプトのテンプレートを残す。
気にかけていることは、
- -e オプションで、エラー時点で処理終了
- エラー時は、$LINENOで、該当行数出力
- -x オプションで、デバッグ
あたりは、必ずできるようにしてる。
余裕がある時は、
- 出力を着色
テンプレート
#!/usr/bin/env bash # template.bash set -e [ -n "$DEBUG" ] && set -x help() { echo "$0 some args" echo "some help" exit 1 } if [ -t 1 ]; then green_color="\e[1;32m" red_color="\e[1;31m" reset="\e[0m" else color="" reset="" fi indent_output() { while read -r data; do printf " ${green_color} | ${reset} %s\n" "$data" done } print_colored() { printf "${green_color}%s${reset}\n" "$1" } err_exit() { printf "${red_color}[ERROR] %s${reset} at line ${LINENO}\n" "$@" exit 1 } for arg; do case "$arg" in --help) help ;; * ) esac done print_colored "Updating some software..." echo -e "hoge\nbar\nfoo" | indent_output err_exit "failed zannen" exit 0
出力は、
デバッグ時は、
DEBUG=1 bash template.bash
とかで、叩くとデバッグできる。
JenkinsをDocker環境にリプレイスする
JenkinsサーバをDockerコンテナとしてリプレイスする手順を示す。
前提
- Jenkinsのバックアップは、ThinBackUpプラグインを使用して取得
- Jenkinsのプラグインは、ThinBackupではバックアップされないので、手動で取得
- Dockerホストは、ローカルのMacOSで、docker-machineを使い稼働
Dockerコンテナとして、Jenkinsを稼働
docker-machine を使いDockerホストを立ち上げる。
ドライバーはVirtualBoxを使う。
$ brew install docker-machine $ docker-machine create --driver virtualbox dev $ docker-machine ssh dev
IPは、後々使うので、メモしておく。
docker@dev:~$ ifconfig eth1 | grep 'inet addr' inet addr:192.168.99.100 Bcast:192.168.99.255 Mask:255.255.255.0
Jenkinsサーバをコンテナとして、起動させる。
この記事が参考になった。
Jenkinsのデータを永続させるためのディレクトリをDockerホストに作成して、起動させる。
$ mkdir /var/lib/jenkins $ docker run -p 8080:8080 -v /var/lib/jenkins/:/var/jenkins_home jenkins
起動できると、http://192.168.99.100:8080 でブラウザからアクセスできる。
確認したら、Ctrl+Cで、抜ける。
Jenkinsのバックアップデータ移行
${JENKINS_HOME} は、jenkinsのホームディレクトリのパスを示す。
コンテナにはいる。
$ docker run -v /var/lib/jenkins/:/var/jenkins_home -it jenkins bash
Jenkinsサーバのバックアップデータの移動手順は、割愛する。
Dockerコンテナにリプレイスする際に、以下のバックアップデータが必要なので、Dockerコンテナの /tmp に配置する。
- ThinBackupプラグインで、作成する FULL-${yyyy}-${mm}-${dd}_${HH}-${MM}のディレクトリ
- ${JENKINS_HOME}/plugins ディレクトリ
データをDockerコンテナ内の ${JENKINS_HOME} に展開する。
$ cp -pr /tmp/FULL-2016-03-08_12-00/* /var/jenkins_home/ $ cp -pr /tmp/plugins /var/jenkins_home/
以上で、データ移行が完了。
ただし、過去のビルド履歴が残っている場合、ビルド時にエラーが出る。
SEVERE: Unexpected executor death java.lang.IllegalStateException: /var/jenkins_home/jobs/test_job/builds/2 already existed;
この場合は、ビルド履歴は削除しておく必要がある。
$ rm -rf /var/jenkins_home/jobs/test_job/builds $ echo '1' > /var/jenkins_home/jobs/test_job/nextBuildNumber
コンテナをCtrl+Cで抜けてから、デーモンとして、Jenkinsを起動させる。
$ docker run -d -p 8080:8080 -v /var/lib/jenkins/:/var/jenkins_home jenkins
以上で、リプレイス完了。