ディレクトリのシンボリックリンク張り替え

表題の通り。よく忘れて、削除・作成としてしまうのでメモしておく。

■ 環境

  • Linux

■ 張り替え

既に存在するシンボリックリンクの向き先を変更したい。

通常のシンボリックリンクの貼り方を実行するとエラーとなる。

$ ln -s /path/to/dir  /path/to/link
ln: creating symbolic link `/path/to/link': File exists
$

強制的に上書きすれば良いのか、とオプションを追加する。

$ ln -f -s /path/to/dir  /path/to/link

エラーが表示されず一見作成されたように見えるが、詳細を見ると元のままである。このオプションで成功するのはシンボリックリンクの先がファイルである場合のみであるようだ。

というわけで、シンボリックリンクの向き先がディレクトリである場合には下記のオプションが必要である。

$ ln -f -n -s /path/to/dir  /path/to/link

これでシンボリックリンクの張り替えが可能である。

以上。

docker-machineのDockerVersionをUpgrade

表題の通り。`brew update`した際にDockerのversionもupdateされているようであったのでdocker-machineで使用するVMもアップグレードすることにした。

■ 環境

  • Docker 1.8.2
  • docker-machine 0.3.1

■ before

versionは下記の通り。

$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      linux/amd64
$

■ upgrade

`docker-machine`で`upgrade`コマンドが存在するので実行する。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM
local   *        virtualbox   Running   tcp://192.168.99.100:2376
$
$ docker-machine upgrade local
Stopping machine to do the upgrade...
Upgrading machine local...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.8.2/boot2docker.iso to /Users/withsin/.docker/machine/cache/boot2docker.iso...
Starting machine back up...
Starting VM...
$

再度versionを確認。

$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.2
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0a8c2e3
 Built:        Thu Sep 10 19:10:10 UTC 2015
 OS/Arch:      linux/amd64
$

ここで気がついたのだが、client側のDockerのversionが上がっていない。もちろん前述の内容ではupgradeはされないのだが、事前に下記コマンドを実行していたはずである。

$ brew upgrade docker

現在のversionは下記であるはずなのだが…。

$ brew info docker
docker: stable 1.8.2 (bottled), HEAD
Pack, ship and run any application as a lightweight container
https://www.docker.com/
/usr/local/Cellar/docker/1.8.2 (9 files, 9.4M)
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/docker.rb
==> Dependencies
Build: go ✘
==> Options
--with-experimental
    Enable experimental features
--without-completions
    Disable bash/zsh completions
--HEAD
    Install HEAD version
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
$

確認してみると、`/usr/local/bin/docker`がシンボリックリンクで存在しているはずなのだが、現在は実体として存在している。現在のdockerのバイナリを別名にし、シンボリックリンクを作成し直して下記のようになった。

$ docker version
Client:
 Version:      1.8.2
 API version:  1.20
 Go version:   go1.5.1
 Git commit:   0a8c2e3
 Built:        Fri Sep 11 01:46:35 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.2
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0a8c2e3
 Built:        Thu Sep 10 19:10:10 UTC 2015
 OS/Arch:      linux/amd64
$

なぜ実体になっていたのか、どの時点でインストールされてしまったのか、わかる範囲で調べてみる。

以上。

■ 関連

変数の一部を置換

shにおいて表題の通り。先日のエントリに続けて似たネタ。Javaにおけるreplace()、PHPにおけるstr_replace()に相当。

■ 環境

  • sh

■ 変数の置換

Javaにおけるreplace()やPHPのstr_replace()と同様に、変換前文字列と、変換後文字列を指定する。

${変数//変換前文字列/変換後文字列}

ちなみに上記は合致した文字列全てを置換する。一番最初に合致したものだけを変換対象とするのであれば下記のようになる。

${変数/変換前文字列/変換後文字列}

変数自体はその後も利用するので、元のままの文字列を保持していてほしい。けれどもここの処理だけは文字列を少しいじって使用したい、という場合に便利である。

■ 例

ZooKeeperの接続文字列を元にfor文を回したい、という時に使用した。

#!/bin/sh

ZOOKEEPER="192.168.33.11:2181,192.168.33.12:2181,192.168.33.13:2181"

for ZK in ${ZOOKEEPER//,/ }
do
  :
done

上記では”,”を” “に変換しfor文を回すようにしている。for文の中では${ZK}で”192.168.33.11:2181″が取得できるであろう。

以上。

■ 関連

変数から一部を取得

shにおいて表題の通り。Javaでいうところのsubstring()、PHPでいうところのsubstr()に当たることをshでやる。

■ 環境

  • sh

■ 変数の切り出し

Javaのsubstring()やPHPのsubstr()と同様に、切り出しの開始位置と終了位置を指定する。終了位置を指定しなければ末尾まで取得される。

${変数:開始位置:終了位置}

■ 例

例として下記のような文字列があるとする。

#!/bin/sh
TEST=",192.168.33.11:2181,192.168.33.12:2181,192.168.33.13:2181"

これはZooKeeperの接続文字列を配列等から生成するような場合。変数の先頭に”,“が入ってしまっているが、これは不要である。配列等からループの1回目だけ”,“を抜くという処理を書くよりは、変数から1文字目だけを抜いた状態で次の処理に渡したい。

#!/bin/sh
TEST=",192.168.33.11:2181,192.168.33.12:2181,192.168.33.13:2181"
echo ${TEST:1}

これを実行すると、下記の結果が得られる。

$ ./test.sh
192.168.33.11:2181,192.168.33.12:2181,192.168.33.13:2181
$

ループの中で、何回目のループであるかをチェックしてif文で条件分岐するよりも楽に書くことができて重宝している。

以上。

■ 関連

Dockerのコンテナ間接続

Dockerにおいて表題の通り。以前からであったのか、versionが上がって実装されたのか定かではないのだが、Dockerコンテナ間の接続が容易になったのでメモしておく。

■ 環境

  • Docker 1.8.1

■ 以前の記憶

Dockerコンテナ間の接続を容易にするには、`dockeru run`時にオプションの`–link`が必要であったように記憶している。`–link`で指定したコンテナと名前を使用することができる。かつ、指定したコンテナが”EXPOSE“しているポート等を環境変数で取得することができる、といったことができた。そもそも記憶違いであったのかもしれないが…。

1.8.1にversionを上げてから気がついたのだが、コンテナ名でのアクセスが容易になっている。後から起動したコンテナでもアクセスできるようだ。

■ 1台目

CentOS6のコンテナを起動する。

$ docker run -ti --rm --name container1 centos:6 /bin/bash
[root@af3ff474df12 /]# cat /etc/hosts
172.17.0.217    af3ff474df12
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.217    container1.bridge
172.17.0.217    container1
[root@af3ff474df12 /]#

`/etc/hosts`に、コンテナIDだけでなく、コンテナ名でも記載がある。

■ 2台目

2台目のコンテナを起動する。

$ docker ps -a
CONTAINER ID    IMAGE       COMMAND      CREATED        STATUS              PORTS               NAMES
af3ff474df12    centos:6    "/bin/bash"  11 hours ago   Up 2 minutes                            container1
$
$ docker run -ti --rm --name container2 centos:6 /bin/bash
[root@736c06b32c57 /]# cat /etc/hosts
172.17.0.218    736c06b32c57
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.217    container1
172.17.0.218    container2.bridge
172.17.0.218    container2
172.17.0.217    container1.bridge
[root@736c06b32c57 /]#

`–name`オプションで指定したコンテナ名でIPと共に記載されている。このコンテナ内では”container1“も”container2“も名前解決ができることになる。

1台目のコンテナ(container1)も再度確認すると下記のようになっている。

[root@af3ff474df12 /]# cat /etc/hosts
172.17.0.217    af3ff474df12
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.217    container1.bridge
172.17.0.217    container1
172.17.0.218    container2
172.17.0.218    container2.bridge
[root@af3ff474df12 /]#

先程は記載されていなかった”container2“も追記されている。

名前解決をしたいということであれば、`–link`オプションを指定して起動する必要はないようである。

■ 3台目

ちなみに`–name`オプションでコンテナ名を指定しなくても追記される。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
736c06b32c57        centos:6            "/bin/bash"         4 minutes ago       Up 4 minutes                            container2
af3ff474df12        centos:6            "/bin/bash"         11 hours ago        Up 11 hours                             container1
$
$ docker run -ti --rm centos:6 /bin/bash
[root@4eae57e9ef12 /]# cat /etc/hosts
172.17.0.219    4eae57e9ef12
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.218    container2
172.17.0.219    serene_brahmagupta.bridge
172.17.0.217    container1.bridge
172.17.0.219    serene_brahmagupta
172.17.0.217    container1
172.17.0.218    container2.bridge
[root@4eae57e9ef12 /]#

1台目のhostsで確認する。

[root@af3ff474df12 /]# cat /etc/hosts
172.17.0.217    af3ff474df12
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.217    container1.bridge
172.17.0.217    container1
172.17.0.218    container2
172.17.0.218    container2.bridge
172.17.0.219    serene_brahmagupta
172.17.0.219    serene_brahmagupta.bridge
[root@af3ff474df12 /]#

また、コンテナ一覧でコンテナ名を確認する。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
4eae57e9ef12        centos:6            "/bin/bash"         About a minute ago   Up 56 seconds                           serene_brahmagupta
736c06b32c57        centos:6            "/bin/bash"         6 minutes ago        Up 6 minutes                            container2
af3ff474df12        centos:6            "/bin/bash"         11 hours ago         Up 11 hours                             container1
$

以上。

■ 関連