osechiman’s blog

開発備忘録

Codelabsをやってみた[Configure an Uptime Check and Alerting Policy]

Codelabs

Configure an Uptime Check and Alerting Policy

1. Overview

Codelabsでこれから何を学ぶかが書いてある。

ヘルスチェックが出来る。
アラートポリシーは様々な条件で設定出来る。

アラートポリシーの条件を満たすとCloud Monitoring Consoleでインシデントとして通知される。
メールでの送信も可能。

このセクションではインスタンスのヘルスチェックをして、アラート(警告)を通知させる。
インスタンスがダウンしている場合はインシデントを通知させる。

2. Setup and Requirements

Googleアカウントを持っていない人は作ってね。
持ってる人はManage resources pageへ遷移して。

プロジェクトがまだ無い場合は作ってねとあったが、
今回は以前に作っていたプロジェクトでやる為、流し読み。

3. Creating Resources to Monitor

リソース監視モニターを作成。

まずはColudLancherを使って監視対象を作成。
ColudLancher初めてDeployまでしたけど
f:id:osechiman:20180120230738p:plain
f:id:osechiman:20180120232034p:plain
この環境がワンクリックで手に入るのはかなり便利だと思った。
月にかかるコストの概算もでてるし、
何か構築したい場合はまずはColudLancherを探そうと思った。

上の手順で作ったリソースを監視していく。

4. Enable Stackdriver Monitoring

StackDriverのアカウントを作成。

指示に従い進めるだけ。
30日間はクレジットカードの登録無しに利用可能。

GCPだけではなくAWSのリソースも監視出来る。

>4.On the Monitor AWS accounts page click Continue
に関してはContinueという選択肢ではなく「Skip AWS Setup」に変更されていた。

セットアップが完了した時点で
既にダッシュボードにはいくつかのリソース状況が表示されている。

5. Create An Uptime Check

ヘルスチェックする。

作成したNGINXサーバに対してHTTPでヘルスチェックをする。
f:id:osechiman:20180120232352p:plain
こんな感じで出来上がる。

6. Create An Alerting Policy

ヘルスチェックに対してアラートを設定する。

若干手順が古い感じの部分があって
Menuの「Uptime Checks」から該当ページへ飛んだ。

ヘルスチェックが失敗した場合にEmailで通知がされるように設定する。

Documentaionは通知内容を追加出来る。
復旧手順、原因に関して考慮する必要があるとあったので
今回は適当に何か入れる。
Markdownで書けるのが地味に嬉しい。

# CodeLabs Insident
## 理由
nginxstack-1-vmのヘルスチェックに失敗しました。
## 原因
考えられるのは以下の通りです。

  1. なんか気分が乗らない
  2. 馬鹿なヤツがうっかり止めてしまった

## 復旧対応
とにかく頑張ってください。
頑張ればなんとかなります。

作成が完了するとPOLICIESにベルマークが出る。
Overviewにも出てくるけど、6つのロケーションから監視が行われる様子。

  • VIRGINIA
  • OREGON
  • IOWA
  • BELGIUM
  • SINGAPORE
  • SAO PAULO

問題の切り分けの際に役に立ちそう。

7. Congratulations!

おめでとう!

いやいや挙動の確認までさせてくれいと思ったので作ったVMを停止してみる。
f:id:osechiman:20180120233951p:plain
停止前はこう。

停止してみる。
f:id:osechiman:20180120234511p:plain

少しするとちらほらロケーション毎にビックリマークに変わっていく。
f:id:osechiman:20180120235723p:plain

全てのロケーションからのチェックにビックリマークが付いてから体感3分位でメールが届いた。

動き的には全てのロケーションからのヘルスチェックが失敗した
というのがインシデントメールのトリガーになっている様に見える。

インシデントメールの内容にデフォルトで書かれるのはこんな感じ。

Stackdriver has detected that one of your resources has entered an alert state.
Summary: An uptime check on codelabs-XXXXX nginxstack-1-vm is failing.
Violation Began: 2018-01-20 14:51:45 UTC (3 mins 43 secs)
Condition Name: HTTP check on instance nginxstack-1-vm

View violation details: https://app.google.stackdriver.com/incidents/XXXXXXXXX

しばらく待っても再度メールが飛んでくるという事は無かったので
CodeLabsの設定では一度飛んできたら通知終わりみたい。

監視設定を削除する際はUptimeChecksに設定しているAlertingを削除後でないと、
UptimeChecksを削除する事は出来ない。

Deleteしても「削除しました」みたいはポップアップは出なくて、
しばらくしたら勝手に消えてた。

大事だと思ったこと
  • アカウント連携だけでもかなり簡単にリソースの監視をする事が出来る。
  • ColudLancher便利。
  • 6つのロケーションから監視が行われる。
  • インシデント発生時のドキュメントがMarkdownで書けるの嬉しい。

Codelabsをやってみた[Creating a Virtual Machine]

Codelabs

Creating a Virtual Machine

1. Overview

Googleのインフラで仮想マシンが実行出来る。
Linuxサーバだけでは無くWindowsサーバも構築出来るって書いてある。

2. Setup and Requirements

プロジェクトのセットアップ。
「CodeLabs」を再利用。

3. Understanding Regions and Zones

リージョンとゾーンの概念説明。
リージョン>ゾーンで理解した。リージョンには複数のゾーンが存在する場合がある。

VMもDiskも好きなゾーンは選べるけど
>to attach a persistent disk to a virtual machine instance, both resources must be in the same zone.

VMに永続Diskをアタッチする場合は同じリージョンでないといけない。
Creating a Persistent DiskのStep.5と一緒

4. Create a new instance

インスタンスを立ち上げ。

指示に従いながらGUIで作成していく。
port:80を空けてトラフィックを受け付ける。

出来上がるのはこんなインスタンス
f:id:osechiman:20171207234932p:plain

sshで接続して、Nginxのinstallして起動確認。

osechiman@gcelab:~$ sudo su -
root@gcelab:~# apt-get update
Get:1 http://packages.cloud.google.com/apt cloud-sdk-stretch InRelease [6,356 B]
・
・
・
Fetched 814 kB in 0s (929 kB/s)                               
Reading package lists... Done

root@gcelab:~# apt-get install nginx -y
Reading package lists... Done
Building dependency tree       
Reading state information... Done
・
・
・
Processing triggers for libc-bin (2.24-11+deb9u1) ...
Processing triggers for sgml-base (1.29) ...

root@gcelab:~# ps auwx | grep nginx
root      2127  0.0  0.0 159504  1620 ?        Ss   14:52   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  2128  0.0  0.0 159840  3240 ?        S    14:52   0:00 nginx: worker process
root      2143  0.0  0.0  12784   964 pts/0    S+   14:53   0:00 grep nginx
5. Create a new instance, with gcloud

gcloudコマンドでインスタンスを作成していく。

[osechiman@cs-6000-devshell-vm-85d16003-8f2b-4b7f-b203-e0b79728da09] $ gcloud compute instances create gcelab2 --zone us-central1-c
Created [https://www.googleapis.com/compute/v1/projects/relaynovel-173804/zones/us-central1-c/instances/gcelab2].
NAME     ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
gcelab2  us-central1-c  n1-standard-1               10.128.0.2   35.225.248.116  RUNNING

毎回zoneのフラグを指定するのがめんどくさかったら

gcloud config set compute/zone ...

でデフォルトを決められる。

gcloud経由でのsshも試す。
gcloudコマンドでもssh接続が出来る。

[osechiman@cs-6000-devshell-vm-85d16003-8f2b-4b7f-b203-e0b79728da09] $ gcloud compute ssh gcelab2 --zone us-central1-c
Updating project ssh metadata.../Updated [https://www.googleapis.com/compute/v1/projects/relaynovel-173804].
Updating project ssh metadata...done.
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.5807026344554718797' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/osechiman/.ssh/google_compute_engine':
Enter passphrase for key '/home/osechiman/.ssh/google_compute_engine':
Linux gcelab2 4.9.0-4-amd64 #1 SMP Debian 4.9.51-1 (2017-09-28) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
osechiman@gcelab2:~$

パスワードはアカウントのものと同一。

6. Custom machine types

定義済みのマシンタイプに使いたい要件に合致するのものがなければ、
カスタムマシンタイプを使ってね。

試しに2つのvCPUと5 GBのRAMを持つ仮想マシンインスタンスを作成。
f:id:osechiman:20171208001535p:plain

こんな感じで表示がされる。

7. Clean up

VM削除。

VM削除をするブートディスクも削除される事に注意。
削除時にはアラートで出してくれるので安心。

削除されては困るsnapshotはもちろん残る。
インスタンスを復元したい場合はsnapshotから復元。

ってやってたらすごく気になる機能を発見した。
f:id:osechiman:20171208002514p:plain
VMインスタンス作成時には気づかなかったが素敵と出会えた。

8. Congratulations!

おめでとう!

9. 大事だと思ったこと
  • gcloudコマンドでもssh接続が出来る。
  • VM削除をするブートディスクも削除される事に注意。
  • VMインスタンスに指定のコンテナイメージをデプロイできる!

Codelabsをやってみた[Creating a Persistent Disk]

Codelabs

Creating a Persistent Disk

1. Overview

Codelabsでこれから何を学ぶかが書いてある。

インスタンス立ててそこに永続ディスクをアタッチするよって感じの事が書いてあると思ってる。

2. Setup and Requirements

プロジェクトのセットアップ。

「CodeLabs」でプロジェクト作成した。

3. Initialize your project environment

インスタンスたちあげ説明。

VMインスタンページへの誘い。

4. Start Cloud Shell

CloudShellの操作方法説明している。

  • activeアカウントの確認
2017/12/05 12:58:08 ~ 
[osechiman@cs-6000-devshell-vm-5ed1868d-4005-4f1e-9e37-d868b8443bc4] $ gcloud auth list
   Credentialed Accounts
ACTIVE  ACCOUNT
*       XXXX@XXXX.XXX

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  • 操作対象のプロジェクト確認
[osechiman@cs-6000-devshell-vm-5ed1868d-4005-4f1e-9e37-d868b8443bc4] $ gcloud config list project
[core]
project = ...

Your active configuration is: [cloudshell-9785]

作ったプロジェクトが出ていない場合はうんぬんは飛ばす。

[osechiman@cs-6000-devshell-vm-5ed1868d-4005-4f1e-9e37-d868b8443bc4] $ gcloud config set compute/zone us-central1-f
Updated property [compute/zone].

5. Understanding Regions and Zones

リージョンとゾーンの概念説明。

リージョン>ゾーンで理解した。リージョンには複数のゾーンが存在する場合がある。

VMもDiskも好きなゾーンは選べるけど

to attach a persistent disk to a virtual machine instance, both resources must be in the same zone.

VMに永続Diskをアタッチする場合は同じリージョンでないといけない。

6. Create a new instance

インスタンスを立てる。

[osechiman@cs-6000-devshell-vm-879cccdf-2684-4166-bf3a-58f36374aae8] $ gcloud compute instances create gcelab --zone us-central1-c
Created [https://www.googleapis.com/compute/v1/projects/...].
NAME    ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
gcelab  us-central1-c  n1-standard-1               10.128.XX.XX   35.224.XXX.XXX  RUNNING

7. Create a new persistent disk

永続Diskの説明と作成。

ネットワークストレージでインスタンス消してもデータはなくならない。

HHDとSSDどちらかが選択出来る。

  • Disk作成
[osechiman@cs-6000-devshell-vm-879cccdf-2684-4166-bf3a-58f36374aae8] $ gcloud compute disks create mydisk --size=200GB \
> --zone us-central1-c
Created [https://www.googleapis.com/compute/v1/projects/...].
NAME    ZONE           SIZE_GB  TYPE         STATUS
mydisk  us-central1-c  200      pd-standard  READY

New disks are unformatted. You must format and mount a disk before it
can be used. You can find instructions on how to do this at:

https://cloud.google.com/compute/docs/disks/add-persistent-disk#formatting

8. Attaching a disk

Diskをアタッチしてマウントする。

  • アタッチコマンド
[osechiman@cs-6000-devshell-vm-879cccdf-2684-4166-bf3a-58f36374aae8] $ gcloud compute instances attach-disk gcelab --disk mydisk --zone us-central1-c
Updated [https://www.googleapis.com/compute/v1/projects/...].

sshインスタンスに接続し、Diskの存在を確認する。

osechiman@gcelab:/dev/disk/by-id$ ls -la
total 0
drwxr-xr-x 2 root root 160 Dec  5 11:39 .
drwxr-xr-x 6 root root 120 Dec  5 11:32 ..
lrwxrwxrwx 1 root root   9 Dec  5 11:32 google-persistent-disk-0 -> ../../sda
lrwxrwxrwx 1 root root  10 Dec  5 11:32 google-persistent-disk-0-part1 -> ../../sda1
lrwxrwxrwx 1 root root   9 Dec  5 11:39 google-persistent-disk-1 -> ../../sdb
lrwxrwxrwx 1 root root   9 Dec  5 11:32 scsi-0Google_PersistentDisk_persistent-disk-0 -> ../../sda
lrwxrwxrwx 1 root root  10 Dec  5 11:32 scsi-0Google_PersistentDisk_persistent-disk-0-part1 -> ../../sda1
lrwxrwxrwx 1 root root   9 Dec  5 11:39 scsi-0Google_PersistentDisk_persistent-disk-1 -> ../../sdb
osechiman@gcelab:/dev/disk/by-id$

なんだmydiskになんないのかよと思ったけど変えたい場合は

When attaching the disk, you would need to specify the --device-name parameter.

オプション指定してアタッチする必要がある。

ファイルシステム指定して、フォーマットして

osechiman@gcelab:/mnt/mydisk$ sudo mkfs.ext4 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done             
Creating filesystem with 52428800 4k blocks and 13107200 inodes
Filesystem UUID: ac716889-2e1b-4619-ba83-aa27e1768823
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done     
Writing inode tables: done     
Creating journal (262144 blocks):

マウント

osechiman@gcelab:/mnt/mydisk$ sudo mount -o discard,defaults /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1 /mnt/mydisk
osechiman@gcelab:/mnt/mydisk$

再起動は勝手にされるのでマウントしてすぐに利用できる。

9. Local SSDs

SSDの紹介。

SSDは早いけどバックアップは自分で取ってね。というスタンス。

可用性とトレードオフでIOPSがしゅごい。

10. Congratulations!

おめでとう!

大事だと思ったこと

  • 同一リージョン内でしか永続ボリュームはアタッチ出来ない。
  • SSDはIOPS出るけど可用性が犠牲になっている。

Docker+MobaXtermで持ち運び出来る開発環境を作る

Docker+MobaXtermで持ち運び出来る開発環境を作る

やりたかったこと

WindowsPCを新しいマシンに替える時に毎回環境構築するのがめんどくさいと思いませんか。

私は思います。

すごい思ってます。

なのでDockerでimageを構築しておけば取り込むだけで「はい環境構築完了」の状態にできるのではと思ってました。

ただGUI系のツールも一緒に入れておいて使いたいので

今回はそこら辺も含め出来たことを備忘録にします。

できたこと

  • Dockerコンテナ内のGUIツールをMobaXterm経由で起動する
材料
作り方

材料にあるツールはすでにインストールされている事を前提とします。

それとツールの使い方も検索すれば出て来るので端折ります。

1.自分のお好みの環境が構築出来るDockerfileを用意します(↓は私が使いたいやつです)

# 僕の考えた最強の開発環境
FROM ubuntu:16.04

# 最強の作者名
MAINTAINER osechiman

# デフォがdashなんでぇシンボリックリンク書き換えてbashでいくんでよろしくぅ!!
RUN ln -fs bash /bin/sh

# packageのupdateしてやる!!
RUN echo '==========パッケージのアップデート開始...==========' && \
apt-get update && \
echo '==========...パッケージのアップデート終了=========='

# ついでにアップグレードお前もだ!!
RUN echo '==========パッケージのアップグレード開始...==========' && \
apt-get -y upgrade && \
apt-get -f install && \
echo '==========...パッケージのアップグレード終了=========='

# 日本仕様に改造してくれるわっ!
RUN echo '==========日本仕様に変更中...==========' && \
apt-get install -y language-pack-ja-base language-pack-ja && \
update-locale LANG=ja_JP.utf8 LANGUAGE=ja_JP.utf8 LC_ALL=ja_JP.utf8 && \
source /etc/default/locale && \
apt-get install -y man manpages-ja manpages-ja-dev && \
echo '==========...日本仕様に変更完了=========='

# 必要なモジュールインストールしていくのだ
## apt-get編
RUN apt-get install -y make vim php bash-completion git git-flow tmux curl python wget nkf ctags golang ssh xorg openbox

## curlとかwgetで頑張る編
RUN echo '==========composerのインストール==========' && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin && \
echo '==========nodebrewのインストール==========' && \
curl -L git.io/nodebrew | perl - setup && \
export PATH=$HOME/.nodebrew/current/bin:$PATH && \
nodebrew -v && \
export NODEBREW_ROOT=$HOME/.nodebrew && \
echo '==========nodeのインストール==========' && \
nodebrew install-binary stable && \
nodebrew use stable && \
node -v

## 設定ファイルを作っていくのです
RUN cp /usr/share/bash-completion/completions/git-flow /etc/bash_completion.d

## .bashrcに色々書いてく...
RUN echo "export GOROOT=~/go" >> ~/.bashrc
RUN echo "export NODEBREW_ROOT=~/.nodebrew" >> ~/.bashrc
RUN echo "export PATH=$PATH:/usr/local/bin/go/bin:$GOROOT/bin:~/.nodebrew/current/bin" >> ~/.bashrc
RUN echo "export PS1='[\[\033[0;34m\]\u@\h \W\[\033[0m\]]$ '" >> ~/.bashrc
RUN echo "if [ -f /etc/bash_completion ] && ! shopt -oq posix; then" >> ~/.bashrc
RUN echo "    . /etc/bash_completion" >> ~/.bashrc
RUN echo "fi" >> ~/.bashrc
RUN source ~/.bashrc
# 使い方
#
## buildコマンド
### docker build -t my-env:1.0 [Dockerfile-DirPath]
#
## コンテナ起動コマンドサンプル
### docker run -itd -p 2022:22 -v [source-dir]:/source --name my-env my-env:1.0 

※割りとはっちゃけたコメントになっているのは深夜に作業した為です。

  • ポイント

Dockerコンテナに突っ込んだGUIツールを利用するために必要なのは

ssh xorg openbox

こちらになります。

他に入れたいコマンドやツールは適宜読み替えてください。

2.Dockerfileからimageを構築

MobaXtermを起動し「Start local terminal」を選択します。

そしたら

docker-machine start sandbox

で作成している仮想環境を立ち上げて

その中でimageを作ってコンテナを起動します。

docker build --no-cache=true -t my-env:1.0 .
・
・
・ //image作成中
docker run -itd -p 2022:22 --name my-env my-env:1.0

コンテナ起動時に-pで

-p 2022:22

しておいてください。

外からコンテナに接続する際に使います。

別に何番ポートでも構わないのですがsshで接続するのでわかりやすいように2022を設定しました。

3.コンテナでsshdを起動&rootでsshを許可する

vim /etc/ssh/sshd_config

 26 # Authentication:
 27 LoginGraceTime 120
 28 PermitRootLogin prohibit-password
 29 StrictModes yes

 26 # Authentication:
 27 LoginGraceTime 120
 28 PermitRootLogin yes // yesに書き換え
 29 StrictModes yes

rootのパスワードも変更

[root@79d7dbd28cb8 /]$ passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

そしたらsshd起動!

/etc/init.d/ssh start

これでコンテナへの接続準備は完了しました。

docker ps で確認するとこんな感じ。

docker@sandbox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
79d7dbd28cb8        sandbox             "/bin/bash"         24 minutes ago      Up 24 minutes       0.0.0.0:2022->22/tcp   my-env

4.MobaXtermでDockerのコンテナに接続する

[osechiman.osechiman] ➤ ssh -p 2022 root@192.168.99.100 // passwordは先程変更したやつ
Warning: Permanently added '[192.168.99.100]:2022' (RSA) to the list of known hosts.
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.27-boot2docker x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Mon Jan  9 08:03:37 2017 from 192.168.99.1
[root@79d7dbd28cb8 ~]$

docker-machineのIPに対して2022ポートでアクセスすると作成したコンテナにアクセスしにいきます。

ssh -p 2022 root@192.168.99.100

xmanを起動しているところが以下の画像です。

f:id:osechiman:20170109171347p:plain

これでDocker内のGUIツールをMobaXterm経由で起動する事が出来ました!

これならどこの現場に行ってもWindowsPCなら環境構築に苦労しないで済むはずっ...!

できなかったこと

この手順ではsshdのデーモン登録が出来ていないです。

今後対応するつもりだけど備忘録にするほどでもないかなぁ。

Dockerコンテナ内のJenkinsにJenkinsCLIを導入

Dockerコンテナ内のJenkinsにJenkinsCLIを導入

やりたかったこと

Dockerコンテナで稼働しているJenkinsにJenkinsCLIを導入。

ちょっとだけハマったので備忘録に。

できたこと

JenkinsCLIの導入。

docker-machienでDockerを動かしてJenkinsを動かしている時に

http://192.168.99.100:8080/cli/

↑のURLにアクセスするとjenkins-cli.jarのダウンロード方法と共に

java -jar jenkins-cli.jar -s http://192.168.99.100:8080/ help

的な感じでコマンド実行例が出てくるけど

Jenkinsコンテナ内で実際にコマンド叩くときは

java -jar jenkins-cli.jar -s http://localhost:8080/ help

192.168.99.100の部分をlocalhostに置き換えないとURLにアクセス出来ないっすって怒られます。

よくよく考えればそりゃhostのIPなんてJenkinsコンテナは知ったこっちゃないか...。

PostgreSQL⇒MySQLへのデータ移行

PostgreSQLMySQLへのデータ移行

やりたかったこと

PostgreSQLのテーブルの一部のデータを、

MySQLで作成した新しいテーブルに移植したい、というような事がありまして。

今回はその時にやった手順の備忘録。

postgres=# \d+ p_name
                                  Table "public.p_name"
   Column    |         Type          | Modifiers | Storage  | Stats target | Description
-------------+-----------------------+-----------+----------+--------------+-------------
 id          | integer               |           | plain    |              |
 first_name  | character varying(40) |           | extended |              |
 family_name | character varying(40) |           | extended |              |

postgres=# \l sandbox
                          List of databases
  Name   |  Owner   | Encoding | Collate | Ctype | Access privileges
---------+----------+----------+---------+-------+-------------------
 sandbox | postgres | EUC_JP   | C       | C     |
(1 row)
  • テストデータ
postgres=# SELECT * FROM p_name;
 id | first_name | family_name
----+------------+-------------
  1 | 太郎       | 田中
  2 | 次郎       | 佐藤
  3 | 三郎       | 鈴木
(3 rows)
mysql> SHOW COLUMNS FROM name;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| first_name | varchar(40) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> SHOW CREATE table name\G
*************************** 1. row ***************************
       Table: name
Create Table: CREATE TABLE `name` (
  `id` int(11) NOT NULL,
  `first_name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

できたこと

単純にPostgreSQLからCSVでデータを出力して

postgres@f78d7d394494:/$ psql -c 'SELECT id, first_name FROM p_name' -A -F, -t > /tmp/p_name.csv

nkfかけて

[root@f78d7d394494 /]$ nkf -w --overwrite /tmp/p_name.csv

MySQLに突っ込む

mysql> use sandbox
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> LOAD DATA LOCAL INFILE '/tmp/p_name.csv' INTO TABLE name FIELDS TERMINATED BY ',' ENCLOSED BY '"';      Query OK, 3 rows affected (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> ^DBye
[root@f78d7d394494 /]$ mysql -p sandbox -e 'SELECT * FROM name'
Enter password:
+----+------------+
| id | first_name |
+----+------------+
|  1 | 太郎     |
|  2 | 次郎     |
|  3 | 三郎     |
+----+------------+
[root@f78d7d394494 /]$

で目的は達成できました。

GAE/go用のDockerfileを作った

GAE/go用のDockerfileを作った

やりたかったこと

GAE/goのスコーンと使える環境を作りたいんです。

できたこと

ubuntuベースでGAE/goが使えるDockerfileができました。

# GAE-GOの開発環境
FROM ubuntu:latest

# 作者名
MAINTAINER osechiman

# packageのupdate
RUN apt-get update

# 日本の環境に合わせる
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# shellをbashにする
RUN ln -fs /bin/bash /bin/sh && /bin/bash

# 日本の環境に対応する為の環境変数
RUN echo "export LC_ALL=jp_JP.UTF-8" >> /etc/profile && \
    echo "export LANGUAGE=jp_JP.UTF-8" >> /etc/profile && \
    echo "export PATH=$PATH:/usr/local/bin/go_appengine" >> /etc/profile

# 必要なコマンドと使いたいコマンドをinstall
RUN apt-get install -y \
    make \
    gcc \
    less \
    curl \
    wget \
    ca-certificates \
    python \
    tar \
    man \
    tree \
    tmux \
    bash-completion \
    git \
    vim \
    jq \
    golang \
    unzip

# go_appengineのSDKをダウンロード
RUN wget https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.40.zip && \
    unzip go_appengine_sdk_linux_amd64-1.9.40.zip -d /usr/local/bin && \
    rm go_appengine_sdk_linux_amd64-1.9.40.zip

# mountする想定でソースを管理するディレクトリ作成
RUN mkdir /source

# 可変的なデータを格納するディレクトリ作成
RUN mkdir /storage

## VOLUME設定
VOLUME /source

## 自分のgitから.bashrcを取得
RUN wget -O /root/.bashrc https://raw.githubusercontent.com/osechiman/MyConf/master/gae/bashrc

## echoをgo getする
RUN /usr/local/bin/go_appengine/goapp get -u github.com/labstack/echo

## ポートを設定
EXPOSE 8000:8000 8080:8080 18080:18080

## ENTRYPOINTの設定
ENTRYPOINT /usr/local/bin/go_appengine/dev_appserver.py --host 0.0.0.0 --admin_host 0.0.0.0 --api_host 0.0.0.0 --api_port 18080 --storage_path /source/storage --skip_sdk_update_check true /source

# 使い方
#
## buildコマンド
### docker build -t gae-go:1.0 [Dockerfile-DirPath]
#
## コンテナ起動コマンドサンプル
### docker run -itd -p 8080:8080 -p 8000:8000 -p 18080:18080 -v [source-dir]:/source --name gae-go gae-go:1.0 
#
# 作られるイメージはgo_appengine_sdkを解凍して使えるようにした最低限のもの
# mount先のディレクトリでコードを書いていく感じで

docker-machineで動かしているのでローカル環境で確認したい場合

192.168.99.100:8080

とか

192.168.99.100:8000

で見れるはずです。

最初alpineベースで作ったら動かなかったので試しにubuntuベースにしたら動いたのでもうこれで良し。

できなかったこと

alpineベースでGAE/goのDockerfileを作ること。

/usr/local/bin/go_appengine/dev_appserver.py --host 0.0.0.0 --admin_host 0.0.0.0 --api_host 0.0.0.0 --api_port

alpineで作った時はこのオプション指定する部分でなんかこけたんだよなぁ...。