メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

Docker上のOracleで初期化処理したい

Docker上のOracleで初期化処理したい

ryoichi0102.hatenablog.com

先日立てたOracle on Dockerですが、初期化処理として
・ユーザーやスキーマが作りたい
・初期データを投入したい
ということがもちろんあり、その記録です。

※追記

なお、現在は公式のOracle Dockerイメージからdocker run~初期化sqlやデータのimportができます。

ryoichi0102.hatenablog.com

Dockerfileを書いてビルド?

諦めました。
下記にソース引用しましたが、bashではなくshでの実行になるので、このコンテナだとやれることが少ないです。

結局、ボリュームマウントで初期化

~/docker/oracle/init/start-up.sh
~/docker/oracle/init/01_create_USER1.ddl
~/docker/oracle/init/02_DATA_USER1.dmp
~/docker/oracle/init/03_create_USER2.ddl
~/docker/oracle/init/04_DATA_USER2.dmp

こんな感じに初期処理が記載されたシェル (start-up.sh)と、user作成用のDDLとdmpファイルを用意して ~/docker/oracle/init 配下などに置きます。

シェルの内容は、

#!/bin/bash

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=XE

/u01/app/oracle/product/11.2.0/xe/bin/sqlplus SYS/oracle@xe as sysdba @/docker-entrypoint-initdb.d/01_create_USER1.ddl
/u01/app/oracle/product/11.2.0/xe/bin/imp     USER1/user1Pass@xe  file=/docker-entrypoint-initdb.d/02_DATA_USER1.dmp full=y
/u01/app/oracle/product/11.2.0/xe/bin/sqlplus SYS/oracle@xe as sysdba @/docker-entrypoint-initdb.d/03_create_USER2.ddl
/u01/app/oracle/product/11.2.0/xe/bin/imp     USER2/user2Pass@xe  file=/docker-entrypoint-initdb.d/04_DATA_USER2.dmp full=y

のような感じです。

そして、実行時にボリュームマウントします。

$ docker run -d -p 10022:22 -p 11521:1521 -v ~/docker/oracle/init:/docker-entrypoint-initdb.d -e ORACLE_ALLOW_REMOTE=true --name my-oracle-container wnameless/oracle-xe-11g

docker-entrypoint-initdb.dディレクトリに置いたシェルファイルは、run時に自動実行されるように元コンテナ(wnameless/oracle-xe-11g)で設定されています。

初期化処理がsqlファイルだけで良い場合はそれを置くだけでSYSTEMユーザーで実行してくれるようになっています。(下記ソース参照)

原作者ソース

github.com

for f in /docker-entrypoint-initdb.d/*; do
  case "$f" in
    *.sh) echo "$0: running $f"; . "$f" ;;
    *.sql) echo "$0: running $f"; echo "exit" | /u01/app/oracle/product/11.2.0/xe/bin/sqlplus "SYSTEM/oracle" @"$f"; echo ;;
    *) echo "$0: ignoring $f" ;;
  esac
  echo
done

ミソは↓ここ↓
*.sh) echo "$0: running $f"; . "$f" ;;
となっているのでbashではなくshで実行されるのです。

また、sqlSYSTEMユーザーで実行されます。

月5ドルのAmazon LightsailでWordPress構築

EC2でWordPressだと高い

WordPressを安価に、と考えると今まではさくらVPSで685[円/月]あたりがおそらく思いつきそうな所でしたが、2016/12/01にAmazon Lightsailが月5$〜という価格でリリースされました。

さっそくLightsailのインスタンスを作成

AWSコンソールからlightsailと検索してもよいですし、
https://lightsail.aws.amazon.com/
にアクセスしても良いです。 

Let's get startdをクリックでインスタンス作成画面へ。

f:id:ryoichi0102:20170131141418j:plain

(2回目以降のアクセスは下記のような表示になります)
Create an instance! をクリックです。

f:id:ryoichi0102:20170130193523p:plain

オプションの選択

Pick your instance imageでWordPressを選択します。
記載時点のバージョンは4.6.1になっていますが、インスタンス作成後にバージョンを上げたりプラグインを差すことが勿論できます。

次に、Choose your instance planで5$のプランに変更しましょう。
なぜ一番最小の5$ではなく10$がデフォルトで選択されているのでしょう…
なお、2017/01時点では初月無料です\(^o^)/

リージョン(AZ)は料金プランの下のChange zoneリンクから変更できるのですが、現在はVirginiaだけで、選択できるのがus-east-1a,1b,1d,1eなのであまり意味は無さそうです。

Name your instanceで名前を入力します。
最初は多分何でも良いということであれば、そのままデフォルトでOKです。

そしてCreateをクリックするとインスタンス一覧画面になります。
次の画面で状態がPending⇒Runningになれば完了です。
1分かからないと思います!

f:id:ryoichi0102:20170130193748p:plain

インスタンスに接続してIPアドレスとパスワードを確認

インスタンス一覧画面にてインスタンスのメニューよりConnectをクリックします。

f:id:ryoichi0102:20170130200427p:plain

ブラウザ上にコンソールが表示されます。
しかも思ったより反応良くてびっくり。

f:id:ryoichi0102:20170130200607p:plain

ここでフッタに表示されているのがこのインスタンスIPアドレスです。

パスワードはコンソールに

$ cat bitnami_application_password

と入力して表示されるものが初期設定パスワードです。
ここでパスワードを確認してコピーするなどします。

またフッターにはPublic IPとPrivate IPが表示されていますので、
http://【Public IPアドレス
へWebブラウザでアクセスすればHello worldが表示されてサイトが確認できます。

管理画面は
http://【Public IPアドレス】/wp-login.php
ですので、WordPressの初期設定をここで始めることができます。

ユーザー名 user
パスワード (先程確認したbitnami_application_passwordに書いてあったもの)

繋いでみる (上級編?SSHで)

インスタンスの一覧よりハンバーガーメニュー⇒Manageです。

下の方のConnect using your own SSH clientに書いてある
Public IPとUser nameを確認してSSHします。

$ ssh -i LightsailDefaultPrivateKey.pem user-name@000.000.000.000

ssh秘密鍵は最下部リンクAccount pageでデフォルトのものがDLできます。

f:id:ryoichi0102:20170130222342p:plain

表示されるアカウントページ内のDownload default keyよりデフォルトのSSH秘密鍵がDLできます。

f:id:ryoichi0102:20170130212434p:plain

phpmyadmin

http://【Public IPアドレス】/phpmyadmin

MySQLにクライアントから接続する

先の手順で確認した

$ cat bitnami_application_password

で表示される文字列がMySQLの初期パスワードになっています。

Docker for WindowsでC: drive is not shared. Please share it in Docker for Windows Settings.

Docker for WindowsではCドライブを共有

エラーメッセージの通りなんですが、Docker for WindowsではCドライブのshareが必要になることがあります。

私はdocker-compose upした時に出ました。
多分ですがvolumes指定があったからでしょう。
コマンドラインオプションでも-vがあれば出ると思います。

>docker-compose up -d
...
ERROR: for apache-php Cannot create container for service apache-php: C: drive is not shared. Please share it in Docker for Windows Settings. ERROR: Encountered errors while bringing up the project.

Please share it in Docker for Windows Settingsなので
タスクトレイのDockerアイコンを右クリック⇒Settings...

f:id:ryoichi0102:20161221150549j:plain

サイドメニュー Shared DrivesよりC DriveをSharedにします。

f:id:ryoichi0102:20161221151431j:plain

OSのパスワードを聞かれるので入力

f:id:ryoichi0102:20161221151439j:plain

ディレクトリ指定したいなぁ。