yan's Handicraft

作成したフリーソフトを公開
Home »

Docker ComposeのYAMLサンプル(Windowsで使う例)

昨年(2016年)ぐらいから、windows 環境で docdker-compose が使いやすくなっていて、 ローカルPC用のテスト環境用のサーバを準備するのに使い始めています。

とはいっても、設定ファイルを整合性を維持して書くのは気を使うし、間違うことも多々あります。

今後も、自分メモとして、ひな形として使えるようにgithubにサンプルを作ってみました。 基本方針としては、docker hub に登録されている、Docker公式イメージを中心に使い、 設定情報も最小限にしています。(一部、公式でないものも使っています。)

色々なファイルをコミットしていますが、一番大事なのは、 “docker-compose.yml” 、 “compose_up.sh” です。(この記事を作成した時点では、redis 、tomcat 、 sftpサーバ 、mysql 、openjdk 用バッチサーバ 、を含んでいます。)


事前条件

  • Docker Toolbox for Windows がインストール済であること
    • 同時に、”VirtualBox” と “Git for Windows” をインストールできるようになっています。必ず両方インストールしておいてください。

yangiYA/docker_compose_sample4win 使用例

  • Windowsの %USERPROFILE% ディレクトリ以下に、yangiYA/docker_compose_sample4win を配置してください。 (Github のシェルや、Dokerのターミナルなら “$HOME” 以下のディレクトリに配置してください。)
  • “Docker Quickstart Terminal”を起動します。
    (“Docker Quickstart Terminal”は[Docker Toolbox for Windows]をインストールすると、スタートメニューや、ショートカットとして登録されています。)
    起動すると、”Git for Windows”ベースのターミナルが起動して、また、VirtualBox上にVMが起動します。

    • 参考: “Docker Quickstart Terminal”を初めて起動する際に、自動的に”default”という名前のVMが作成されます
  • yangiYA/docker_compose_sample4win を配置したディレクトリに移動ます。
  • compose_up.sh” を起動して、docker container を実行します。
$ ./compose_up.sh
 
... (中略) ...
 
Creating java_01
Creating mysql_01
Creating mysftp_01
Creating tomcat_01
Creating myredis_01
 
****************************************************
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                  PORTS                     NAMES
f6464333f619        redis:3-alpine         "docker-entrypoint.sh"   2 seconds ago       Up Less than a second   0.0.0.0:16379->6379/tcp   myredis_01
63f4236086b9        tomcat:8.5-alpine      "catalina.sh run"        2 seconds ago       Up Less than a second   0.0.0.0:18080->8080/tcp   tomcat_01
eb5b35bb9661        atmoz/sftp:alpine      "/entrypoint sftpuser"   2 seconds ago       Up Less than a second   0.0.0.0:10022->22/tcp     mysftp_01
e1132ad801b4        mysql:5.6              "docker-entrypoint.sh"   2 seconds ago       Up Less than a second   0.0.0.0:13306->3306/tcp   mysql_01
59996af37e4d        openjdk:8-jdk-alpine   "tail -f /dev/null"      2 seconds ago       Up Less than a second                             java_01
 
 
 
****************************************************
* IP of Linux VM(for docker containers)
192.168.99.100
****************************************************
 
 
$

Dockerコンテはへのアクセス方法

上のログの場合 “192.168.99.100” がVMのIPです。 Dockerコンテナへの接続には、「ローカルPC」=>「VM」=>「各Dockerコンテナ」と経由してアクセスします。

上のログのうち、一番上を例とすると

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                  PORTS                     NAMES
f6464333f619        redis:3-alpine         "docker-entrypoint.sh"   2 seconds ago       Up Less than a second   0.0.0.0:16379->6379/tcp   myredis_01
  • ローカルPCからは “192.168.99.100:16379” に接続すると、Dockerコンテナのredisサービスに接続できます。
  • 他のDockerコンテナから、アクセスする場合は、ネットワーク名”myredis_01″、ポート”6379″ でアクセスできます。
    • ネットワーク名が、割り当たっているIPを参照するには、 “docker_network.sh” を実行すると参照できます。

docker-toolboxパスの変換がされない件の対処法

1月 28th, 2017 Posted in Docker, PC/システム開発 Tags:

先日、docker-toolboxをバージョンアップしてハマった件(http://ti.que.jp/p/2017/01/26/docker-toolbox12_5/ ,Windows上のフォルダとdockerのフォルダのマッピングできなくなり) についての対処方法です。

環境変数 COMPOSE_CONVERT_WINDOWS_PATHS1 を指定することで、以前と同様の振る舞いをします。 COMPOSE_CONVERT_WINDOWS_PATHS の仕様については以下に記述あり。

より具体的な対応方法の例は

  • Windowsの環境変数に設定してしまう
  • docker-composeを実行するシェルで環境変数を指定する

ようなところかと思います。シェルの例としては以下のような感じでどうでしょうか。

#!/bin/sh
HERE=$(cd $(dirname $0);pwd)
cd $HERE
export COMPOSE_CONVERT_WINDOWS_PATHS=1
docker-compose --project-name project01  up -d  --build

なお、環境変数COMPOSE_CONVERT_WINDOWS_PATHSをデフォルトのまま変更しない場合は 「virtualBolxの共有ディレクトリ指定」「docker-compose.ymlに記述するパス」「Docker Quickstart Terminalでのパス」「VM上のパス」 の辻褄をあわせれば動作させるることができるのではないかと思います。 (逆に設定面倒なのでやってみてません。)

docker-toolbox12.5以後パスの変換がされなくなった

1月 26th, 2017 Posted in Docker, PC/システム開発

docker-toolbox バージョンアップすると Windows上のフォルダとdockerのフォルダのマッピングできなくなり 動かなくなった。

おそらく原因は以下のサイトが示すもの。
https://forums.docker.com/t/docker-compose-volume-mounts-dont-work-with-docker-toolbox-running-on-windows/26211/3

以前は、”C:\Users/”以下に配置しておけば、自動的にマッピングできたのですが、 Windows toolbox 12.5.x 以降仕様が変わり、自動的に変換しなくなった模様。

解決方法を考え中

Stream インタフェースを実装して Either を作る

7月 14th, 2016 Posted in java, scala Tags: , , ,

java で開発していると、 Either クラス がほしくなることがあります。(Scala だったらな。。。と思ってしまいます)
関数型ライブラリ http://www.functionaljava.org/ や http://www.javaslang.io/ などを採用すれば、 Either クラスが実装されているのですが、 これらのライブラリを使うと、
java 標準の List 、 Set 、Stream 、Optional を捨てる覚悟がいります。

家で趣味で作る分ならともかく、仕事で参加メンバー全員にこれを強いるのはなかなか勇気がいります。

そこで、java.util.stream.Stream インタフェースを実装した Either クラスを作ることを思いつきました。

Stream は java8の標準ライブラリなので、java の List 、Stream 、Optional は問題なく使えそうです。 そして、 Either も使える。
うまくいきそうな気がします。。。

実装したクラスの配置場所

クラス設計の方針

以下、簡単ですが一応説明します

  • 抽象クラス Either 、具象クラス Either.Left 、 Either.Right を作る。

  • Either.Left が異常系で使用する値クラス。 Either.Right が、正常系に使用する想定の値クラス。

  • Either.Left は、Stream#empty() と同じようなふるまいをする。

  • Either.Right は Stream#of(value) と同じようなふるまいをする。

これから、使ってみようかなと思います。使いやすいのか否かはこれから評価します。

  • Optional も Stream インタフェースを実装した Option とか作れば、不満 も解消するかも。

java8 の OptionalとStreamに対する不満

4月 22nd, 2016 Posted in java, PC/システム開発 Tags: , ,

java8でラムダ式がサポートされて、ある程度やり易くはなったのですが これだけは何とかしてほしかったというグチです。
使っていてすごく不便に感じます

Optional#ofNullable(value) メソッド名長い

Optional#of(value) は、value にnullを渡すと例外を吐くので、使いにくい。 結果、Optional#ofNullable を多用することになるのですが、なんとも長ったらしいメソッド名です。 Optional#of を、 Optional#ofUnnableNull とかにして、 Optional#ofNullable の機能を、 Optional#of としてくれればよかったのに。

いつも、以下の変な別名メソッドつくる羽目になります。

/** {@link Optional#ofNullable(T)} のシノニム */
public static <T> Optional<T> opt(T value){
    return Optional.ofNullable(value);
}

OptionalとStreamとに共通のインタフェースがない

Stream#flatMap に渡す関数の戻り値を Optional にできないのが非常に使いづらい。 共通のインタフェースを定義して受け取れるようにしてほしかったです。 せめて、Stream#flatMap をオーバーロードした

<R> Stream<R> flatMap(Function<? super T, ? extends Optional<? extends R>> mapper);

があるだけでももうちょっと使いやすかったのに。java8に定義されているのは、

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

だけ。

final List<Integer> intList = Arrays.asList(new Integer[] { 1, 2, 3, 4,5 });

//これはコンパイル通る。
System.out.println(
        intList.stream().flatMap(num -> Stream.of("'"+ num +"'"))
        .collect(Collectors.toList())
                ); // ['1', '2', '3', '4', '5']

//これはコンパイルエラー。
//intList.stream().flatMap(num -> Optional.of("'"+ num +"'"));


//こんな関数が存在していたとしても、利用できない
final Function<Integer, Optional<String>> f = num -> Optional.of("'"+ num +"'");

//これはコンパイルエラー。
//intList.stream().flatMap(f);

//こんな関数を作らないといけない。イヤダ。
final Function<Integer, Stream<String>> f2 = num -> Stream.of(f.apply(num).get());

System.out.println(
        intList.stream().flatMap(f2)
        .collect(Collectors.toList())
        ); // ['1', '2', '3', '4', '5']
//Optional ==> Stream 変換するstaticユーティリティを作る羽目になる

  • Stream インタフェースを実装して Either を作る と同じようなことをすれば、Optional よりましなものになるかも。 ただ、java8 の標準の Optional があるのに、わざわざ新しく作った Optional を使うほうが使いやすくなるのかという疑問はあります。

Chocolatey でWindowsパッケージ管理

3月 30th, 2015 Posted in PC/システム開発, パッケージ管理

Ansible や Docker でテスト環境をセットアップするには、 Vagrant や Virtualbox を使ってテスト環境を構築したいのですが、 インストールやアップデートをするのは何かと面倒です。

今回は、Windowsのパッケージ管理ソフト Chocolatey を使って、 Vagrant や Virtualboxをインストールします。

Chocolatey インストール

コマンドプロンプトを 管理者権限 で開いて、以下を入力。 ( Chocolatey 本家サイト に書いてあるコマンド。)
これにより、 install.ps1 がダウンロードされ実行されて、インストールされる。

C:\WINDOWS\system32> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "(iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))) >$null 2>&1" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin

おわったら、以下のコマンドを入力して、 chocolatey を最新化する。 (2015-3-29時点、これをやらないと 9.8系から9.9系へのバージョンアップしない)

C:\WINDOWS\system32> choco install chocolatey -force

インストール確認

C:\WINDOWS\system32> choco
Chocolatey v0.9.9.2

コマンドプロンプトを管理者権限で開く方法

お奨めは以下の方法。

  • Windowsキー を押下したあと、cmd をキー入力し、 Ctrl + Shift + Enter で起動

virtualbox と vagrant インストール

  • 管理者権限 でコマンドプロンプトを開いて、以下のコマンドを実行。
    (インストール作業は、原則 管理者権限 でコマンドプロンプトで実行する必要がある)
C:\WINDOWS\system32> choco install virtualbox vagrant -y

これで、Virtualbox と Vagrant のインストールが完了する。
Vagrant はWindows再起動しないと反映されないので、Windows を再起動する。

オプション -y はインストール中の質問にすべて、yesで回答する意味。
付けないでもインストールできるが、コマンドプロンプトで対話的に回答を求められる。
確認しながらインストールしたい場合は、 -y をはずすと良い。

プロキシが必要な環境では

環境変数 http_proxy , https_proxy を設定する必要がある。 形式は http://proxy.your.url:8080 のように設定。

Chococlatey のコマンド

アンインストールの場合は、 choco uninstall [対象パッケージ]
Chococlateyで使用できるコマンドは、 Command Reference に 掲載されている。

GUI版の Chococlatey

choco install chocolateygui とすると、GUI版の Chococlatey がインストールできる。

感想

  • GUI版は、お手軽で使いやすいと感じた。
  • CUI版は、管理者権限でコマンドプロンプトを起動しないといけないのが、ちょっと、うざったい。
    なれればそんなに気にならないかも。
  • まとめて複数のパッケージをインストールするのが楽。
  • オープンソースであり、 Windows がサポートしているわけではないので、 公開されているパッケージの信頼性や、公開されている最新か否かは自己責任になる。
    それを差し引いても使いたい魅力があるとおもう。

WindowsでDocker(Docker for Windows)

3月 28th, 2015 Posted in Docker, PC/システム開発

かつて、Windowsマシン上でDockerを使用するには、
Vagrant、VirtualBox、DockerをプロキシするLinux(coreos など)を 自力で組み合わせて環境構築する必要がありました。

「Docker for Windows Installer」(Docker公式)を使うと、それだけでDockerが利用できるようになった模様です。

メンバーに同じテスト環境を配布できたらうれしいので、ちょっとやってみます。

「Docker for Windows Installer」 インストール

  • Docker公式サイトで配布されている 「Docker for Windows Installer」 をつかってインストールする。
    最新版にたどり着くためには 「Windows用インストーラの説明サイト」 から”Docker for Windows Installer”のリンクをたどってインストーラを探すのがよいかと思う。
  • インストーラ docker-install.exe を実行して、インストールウィザードに従うと、 「Boot2Docker For Windows本体」「VirtualBox」「MYSYS-git」 がセットでインストールされる。
    「VirtualBox」「MYSYS-git」がすでにインストール済の場合は、 インストールしなおすかそのまま使うか選択できる。
  • インストールが完了すると、 「Boot2Docker Start」というショートカットがデスクトップにできる。

boot2docker 最新化

Windowsのコマンドとして、以下を実行。 (コマンドプロンプトやPowerShellのプロンプトで実行)

boot2docker download

boot2docker の開発は活発で、はまだまだ頻繁にアップデートされそう。たまにったほうがよさそう。

ちなみに、 boot2docker コマンドは、「Docker for Windows Installer」 によって、Windowsの環境変数にパスが通る。

Dockrのホスト役のVM作成・起動・停止

Dockrのホスト役のVM boot2docker-vm を作成する

C:\hoge > boot2docker init

VMのディスクサイズを指定したければ以下 (単位はMB。あまり巨大なサイズを指定すると時間がかかる傾向にある)

C:\hoge > boot2docker init --disksize=100000

init により、Virtualbox にVMが作成される。

boot2docker-vm を起動する

boot2docker start

(20015-03-28 時点 C:\Users が VM上の /c/Users/ としてアクセスできるように共有設定されていた)

boot2docker-vm を停止する

boot2docker stop

boot2docker-vm を削除するする

作った boot2docker-vm を作り直したかったら以下を実行。

boot2docker delete

Boot2Dockerで使用するターミナルについて

boot2docker を使用するにあたっては、「Windows のコマンド」、 「ssh コマンドで Linux VM に接続」 「Linux ターミナル内で、linux のコマンド操作」と 色々なコマンド操作が必要になる。

私は、「GitHubForWindows のシェル」だけで、全部操作してしまうのをお奨めする。
(別途 GitHubForWindows をインストールする必要あり)

以下、使えそうなターミナルの特徴をいくつかご紹介する。

  • GitHubForWindows のシェル (PowerShellのターミナルベース)

    • 「windows コマンド」・・・
    • ssh接続 ・・・
      • boot2docker ssh とするとssh接続できる。
      • ssh接続してしまえば、linux コマンドが普通に操作できる
  • コマンドプロンプト

    • 「windows コマンド」・・・
    • ssh接続 ・・・ 不可
  • MYSIS GIT Bash

    • 「windows コマンド」・・・ 一部可。 (boot2docker コマンドは使用できる)
    • ssh接続 ・・・
      • boot2docker ssh とするとssh接続できる。
      • ssh接続してしまえば、linux コマンドが普通に操作できる
  • ターミナルソフト (“teraterm”、”putty” など)

    • 「windows コマンド」・・・ 不可
    • ssh接続 ・・・
      • %USERPROFILE%\.ssh\id_boot2docker にboot2docker用の秘密鍵が 作成されているので、これを使ってSSH接続する。
      • IPアドレスは boot2docker ip で調べられる。
      • linuxターミナルに限った使い勝手としては、一番良いと思われる。
  • Boot2Docker Start (boot2dockerをインストールするとデスクトップにできるショートカットから起動)

    • 「windows コマンド」・・・ 不可
    • ssh接続 ・・・
      起動すると、ssh接続した状態になる。このターミナルからは、 boot2docker-vm を停止させられない。 いけてない。

Dockeコンテナ動作確認

GitHubForWindows のシェルを使用するのを前提に以下説明します。 別のターミナルを使う場合は適当に読み替えてください。

Docker が用意しているサンプルイメージ hello-world を使って動作確認。

C:\hoge > boot2docker ssh

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
511136ea3c5a: Pull complete
31cbccb51277: Pull complete
e45a5af57b00: Pull complete
hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should n
ot be relied on to provide security.
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that  ... 以降省略 ...

問題なければ上ようにdockerのimageがダウンロードされて動作し、 Hello from Docker. が表示されるはず。

Docker Compose について

複数の DockerコンテナをYAMLファイルで管理するツール。 (Docker Compose は fig の後継)

2015-03-28 時点では、boot2docker-vm 上で動かすことができない。
使用したい場合は、別途 Linux VM を立てて、 Docker Composeをインストールする必要があると Docker の issue 管理の回答では述べられている。 VM boot2docker-vm に色々ライブラリをインストールしてやると、動かせるかもしれないが不明。 (Docker Compose は fig の後継) 今後に期待。

関連URL

  • Docker Compose — http://docs.docker.com/compose/
  • Fig — http://www.fig.sh/
  • 動かないことを説明している issue
    • https://github.com/docker/compose/issues/1032
    • https://github.com/docker/compose/issues/599
  • 「Windows で動かしたいね」という issue
    • https://github.com/docker/compose/issues/1085

感想

  • 同じ環境を何度も簡単に作り直せそう。
    • Doker hub には、Docker公式のイメージもたくさんあり、使えそう。
  • Docker Compose が現時点使えないので、 複数サーバを組み合わせた環境を作るには面倒。意図通りのテスト環境を配布するのは少し苦労しそう。
    (Vagrant の Provider を利用して dockerコンテナを作る方法も検討したい。)

おしい。


特記事項: プロキシ

プロキシが必要な環境では、 docerコンテナがインタネットアクセスする際に失敗してまう。 以下対応策。

  • boot2docker-vm にsshログインして作業する。
$ sudo vi /var/lib/boot2docker/profile
  • 設定する内容
export HTTP_PROXY=http://your.proxy.url:8080
export HTTPS_PROXY=http://your.proxy.url:8080

http://your.proxy.url:8080 部分はご自分の環境の値に設定してください。

  • 設定後、Dockerコンテナを再起動
$ sudo /etc/init.d/docker stop
$ sudo /etc/init.d/docker start
  • 参考
    /etc/init.d/docker スクリプト内で、 /var/lib/boot2docker/profile を実行するようになっている。
    このため、これで解決できるのは、docker コンテナからのアクセスだけ。 VM boot2docker-vm から直接、インターネットアクセスするには、 いちいち環境変数設定したり、プロキシーのパラメータを設定しないと解決しない。

忘れたくないGitコマンド

2月 1st, 2014 Posted in git, PC/システム開発

よく使うの機会があるのに、すぐに忘れてしまうGitコマンド。
忘れない自信がないので、まとめてメモっておくことにします。


特定のブランチのみを clone する

git clone -b hogefoo_branch  --single-branch  git@github.com:hogeFooUserName/foo_prj.git
  • これで clone すれば、リモートリポジトリがどれだけブランチだれけでも、
    ローカルリポジトリでは pull して push するだけのお手軽な環境になる。

リモートリブランチを取得して、ローカルブランチを作成する

git checkout -b hogefoo-branch origin/hogefoo-branch

コミット間の変更ファイルの一覧を出力する

git --stat  
  • ローカルリボジトリと、他のブランチと、差分があるファイルの一覧は以下のような感じで
git --stat hogefoo_branch
  • リモートにしかブランチがない場合は、いったんローカル fetch から 一覧取得する
git fech origin hogefoo_branch  <-- リモートリポジトリ origin の hogefoo_branch ブランチを取得  
git --stat hogefoo_branch
  • カレントディレクトリの変更状況は、一応書いておくと以下。(これはいつも使うので、私は忘れません)
git status

HEAD のブランチの張替

git symbolic-ref HEAD refs/heads/hogefoo-branch`
  • 私の場合は、たまに使いたくなる。
    普通に clone してで最初にカレントブランチになるものがこれで変えられる。

リモートの名前を変更する

git remote origin  hoge_remote
  • 普通に clone するとリモートリポジトリの別名は、origin になるが、
    それを変えたい場合に使う。
    ローカルリポジトリを、複数のリモートリポジトリを紐づけるときなどで使う。

リモートを追加する

git remote add foofoo_remote   git@github.com:FooFooUserName/foo_prj.git`
  • これも、ローカルリポジトリを、複数のリモートリポジトリを紐づけるときなどで使う。

リモートブランチを消す

git push :hogefoo_branch
  • いらなくなった個人リポジトリを消すときなどに使う。
    個人リボジトリ、コミットし過ぎて、 base となるブランチから作り直したくなったりした場合に使う。
  • 何にもないローカルブランチを、リモートの hogefoo_branch に push する。
    だから消えるということらしい。

    • git push localhoge:hogefoo_branch は、ローカル localhoge ブランチを リモートの hogefoo_branch ブランチとして pushする
      という意味なので、上のやり方で、リモートブランチが消える。 「3.5 Git のブランチ機能 - リモートブランチ
      にのっている。

VirtualBox上のVMをWindowsバッチコマンドで起動する

11月 2nd, 2013 Posted in Linux, PC/システム開発, Virtualbox, VM

VirtualBox で VMをよく起動するのなら、「VirtualBox マネージャー」を起動してからVM名をダブルクリックして起動するが面倒ですね。 「バッチコマンド一発で起動してくれたらいいな」と思えてきます。

「VirtualBox マネージャー」には、結構CUIコマンドが用意されています。 (説明サイトは、マニュアルサイト「8.2. Commands overview」 )

VMの起動コマンド例

cd %~dp0
cd VirtualBox

echo Documentation for CUI command , see http://www.virtualbox.org/manual/ch08.html .

echo *** VM List ***
VBoxManage.exe list vms

echo *** Start linuxbean
VBoxManage.exe startvm "linuxbean"

cd %~dp0

ちょっと解説

ポイントごとの少し解説します。

@echo off
cd %~dp0
cd VirtualBox

VirtualBox のインストールディレクトリに移動しています。環境に応じて書き換えが必要な場所です。
(cd %~dp0 はバッチファイルの配置ディレクトリに移動するおまじないです。(バッチコマンド詳しい人には蛇足かもしれませんが ))
VBoxManage.exe が存在するディレクトリに移動しています

echo *** VM List ***
VBoxManage.exe list vms

list で自分の環境で登録されている VM の一覧を表示します。VM名も表示されます。VM名は、VMを起動する際にも使用します。

echo *** Start linuxbean
VBoxManage.exe startvm "linuxbean"

startvm <VM名>で VM起動します。

まとめ

  • マニュアルサイト「8.2. Commands overview」 には他にも色々CUIコマンドが説明されています。
    サイトには次のように書かれています。 “VBoxManage is the command-line interface to VirtualBox. With it, you can completely control VirtualBox from the command line of your host operating system.”
    GUIでできることは何でもコマンドラインでできそうです。
    ただ、私は今回ここまででやりたいことはできたので、これでおしまいにします。

WinMerge を Windows のGitシェルのdiffツールに使う

6月 6th, 2013 Posted in git, PC/システム開発

Windows環境で、git diff したときに WinMerge で比較できるようにした時のメモ。 (GitForWindowsのシェルを使用することを前提)

手順

  • extDiff.sh に以下の内容を書いて、パスを通したディレクトリに配置する
#!/bin/sh

# If there are seven arguments, new file and old file will be passed to an argument. 
[ $# -eq 7 ] && /c/<WinMergeのインストールディレクトリ>/WinMergeU "$2" "$5"
  • コマンド git config --global diff.external extDiff.sh を実行

参考