docker-composeで起動したコンテナにbashで入ったりコマンドを渡す

f:id:setouchinatsu:20190403180056p:plain:w200

立ち上がっているコンテナに入る

立ち上げている状態のコンテナIDに対してdocker exec -ti app bashとして入ることもできるが、docker-composeコマンドから直に入ることもできることを知った。

docker-compose exec app bash

もちろん以下のようにもできる

docker-compose exec app php /path/to/hoge.php

コメントで教えてもらいましたが、当初はdocker-compose run app bashと書いておりました。こちらはコンテナを立ち上げての処理になるので、既に起動しているコンテナに入る時はexecを、まだ立ち上げていないコンテナに入る場合はrunを使えば良さそうです。

コンテナを立ち上げてコマンドを実行する

単純なコマンドをラップしたDockerイメージを開発する時にはdocker-compose runを使うと捗る。例えば普通のdockerコマンドでも同じことができるけど、docker-composeを使うと環境変数の管理が楽なので大変良い。

docker-compose run app node /app/index.js

また、バッチ関連をdocker化した場合においてだが、バックグラウンドで実行しておきたいって時はこんな感じで-dをつければ良い。

docker-compose run -d app node /app/index.js

Node.jsのhttp-proxyでプロキシサーバーを作る

npmのhttp-proxyを使えば簡単に作れる。まずはインストールから。

npm install http-proxy

以下のファイルを作ってnode index.jsなどで起動した後、http://localhost:8080にアクセスするとhttp://example.comの内容が表示されます。

var http      = require('http');
var httpProxy = require('http-proxy');
httpProxy.createProxyServer({target: 'http://example.com'}).listen(8080);

SSLに対応したプロキシを作る事もできます。テスト的に証明書を作る時は以下を参考。
http://qiita.com/setouchi/items/8fa6bc87503b597c285f

この証明書を以下のように渡してあげてhttps://localhost:8080にアクセスすればSSL経由でコンテンツを閲覧できます。

httpProxy.createServer({
target: 'http://example.com',
ssl: {
key:  fs.readFileSync('valid-ssl-key.pem', 'utf8'),
cert: fs.readFileSync('valid-ssl-cert.pem', 'utf8')
}
}).listen(8080);

ちなみに上記ではX-Forwarded-Forが受け側に渡らない。渡したい場合はxfwdオプションでtrueを指定すれば良い。

httpProxy.createServer({
target: 'http://example.com',
ssl: {
key:  fs.readFileSync('valid-ssl-key.pem', 'utf8'),
cert: fs.readFileSync('valid-ssl-cert.pem', 'utf8')
},
xfwd: true
}).listen(8080);

以上のようなオプションがいろいろあって詳細な設定までが可能でした。
https://github.com/nodejitsu/node-http-proxy#options

参考
https://github.com/nodejitsu/node-http-proxy

Laravel 5でSQLを直接実行する

print_r(\DB::select(\DB::raw('SHOW VARIABLES LIKE "%char%"')));

今回はテストなのでCLIから実行。

[root@43c787b378a6 app]# php artisan hoge:test
Array
(
[0] => stdClass Object
(
[Variable_name] => character_set_client
[Value] => utf8mb4
)
[1] => stdClass Object
(
[Variable_name] => character_set_connection
[Value] => utf8mb4
)
[2] => stdClass Object
(
[Variable_name] => character_set_database
[Value] => utf8mb4
)
[3] => stdClass Object
(
[Variable_name] => character_set_filesystem
[Value] => binary
)
[4] => stdClass Object
(
[Variable_name] => character_set_results
[Value] => utf8mb4
)
[5] => stdClass Object
(
[Variable_name] => character_set_server
[Value] => latin1
)
[6] => stdClass Object
(
[Variable_name] => character_set_system
[Value] => utf8
)
[7] => stdClass Object
(
[Variable_name] => character_sets_dir
[Value] => /usr/share/mysql/charsets/
)
)

参考
http://stackoverflow.com/questions/32594181/laravel-5-execute-sql-statement-in-string

MySQLの文字コードを調べる

データベースの文字コードを調べる

SHOW CREATE DATABASE exmaple;

テーブルの文字コードを調べる

show table status from example like 'hoge';

現在の接続の文字コードを調べる

SHOW VARIABLES LIKE '%char%';