銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

SQL Server on Linux を RHEL や OpenShift で動かしてみる

さて、SQL Server on Linuxがpublic releaseになりましたので

blogs.technet.microsoft.com

早速、RHELやOpenShiftで動かしてみたいと思います。といっても、RHELで動かすのは手順通りやるとあっという間に動いてしまいます。

docs.microsoft.com

ちなみに、rootでリダイレクトするためだけにsudo suしているところは次のようにやるとsudo1回ですむはずです。

$ sudo sh -c "curl https://packages.microsoft.com/config/rhel/7/mssql-server.repo > /etc/yum.repos.d/mssql-server.repo"

さて接続テストですが、sqlcmdは別パッケージなのでサーバーで接続する場合もパッケージを追加します。

docs.microsoft.com

sqlcmdを使うのもいいですが、せっかくなのでVisual Studio Code拡張を使ってみましょう。拡張をインストールします。

marketplace.visualstudio.com

そのあと、ファイルを新規作成して、Language ModeをSQLにします。その後、Ctrl+Shift+Cを押すと接続先とユーザー/パスワードなどを聞かれるので全部正しく入力するとそのサーバーに接続します。Ctrl+Shift+Pを押して、MSSQL:Connectと入力しても同じことになります*1。あとは適当なSQLを入力して、Ctrl+Shift+EもしくはCtrl+Shit+PからのMSSQL:Executeで実行します。

f:id:tanaka733:20161119181830p:plain

さて、次にOpenShiftで実行してみましょう。SQL Server on LinuxのコンテナがDocker Hubに置いてあるので普通のコンテナと同じように実行すればよいのですが、いくつか注意点があります。現在のSQL Server のコンテナはrooユーザーでプロセスを実行する必要がありますが、これはOpenShift上で動かすコンテナとしてはデフォルトの設定では許可されていません。

blog.openshift.com

とりあえずテスト目的ということで許可しましょう。

$ oadm policy add-scc-to-user anyuid -z default

また、Dockerとして動かす場合のドキュメントにある通り、ACCEPT_EULASA_PASSWORD環境変数を指定しないと動きません。

Run the SQL Server Docker image on Linux, Mac, or Windows - SQL Server vNext CTP1 | Microsoft Docs

次のように指定します。

$ oc env dc/<deploymentconfigの名前> ACCEPT_EULA=Y SA_PASSWORD=<password>

これで動けばよいのですが、パスワードが簡単すぎた場合など、起動に失敗するケースがあります。OpenShiftだと起動に失敗した場合、コンテナのログしか確認できません。

$ oc logs <podの名前>
Configuring Microsoft(R) SQL Server(R)...
Microsoft(R) SQL Server(R) setup failed with error code 1. Please check the setup log in /var/opt/mssql/log for more information.

という感じに詳細は/var/opt/mssql/log を見ろとありますが、起動に失敗したPodはすぐにterminateされるのでこのファイルを見れません。このような場合は debugコマンドを使いましょう。debugコマンドにより所定の起動コマンドが実行される前の状態でコンテナに入れるので、表示された起動コマンドを実行してログを確認します。ちなみに/var/opt/mssql/logはディレクトリで、しかもこのshellは補完がきかないので先にlsでファイルを確認しています。

$ oc debug <terminateされたpodの名前>
Debugging with pod/mssql-server-n-xxxxx-debug, original command: /bin/sh -c /opt/mssql/bin/sqlservr.sh
Waiting for pod to start ...
Pod IP: 10.1.0.n
If you don't see a command prompt, try pressing enter.

# /bin/sh -c /opt/mssql/bin/sqlservr.sh
Configuring Microsoft(R) SQL Server(R)...
Microsoft(R) SQL Server(R) setup failed with error code 1. Please check the setup log in /var/opt/mssql/log for more information.
# ls /var/opt/mssql/log
HkEngineEventFile_0_131240215600920000.xel  errorlog  errorlog.1  log.trc  setup-20161119-093236.log  system_health_0_131240215607860000.xel
# cat /var/opt/mssql/log/errorlog
<snip>
2016-11-19 09:32:41.37 spid17s     Password validation failed. The password does not meet SQL Server password policy requirements because it is too short. The password must be at least 8 characters.

こんな感じでエラーメッセージが確認できます。最後の方はOpenShiftのコマンド紹介になってしまいましたが、他のコンテナプラットフォームで同じような制約がある場合にも使えるかと思います。

*1:mssql:connectは全部入力しなくても適宜補完されます