AdminerのOracle対応
昨日はとりあえず動くところまでできたので、Dockerfileを整えてみた。
https://github.com/umemak/docker-adminer/blob/master/4/Dockerfile
イメージサイズ800MB弱。 もっとスリム化できないかな。
POSTS
昨日はとりあえず動くところまでできたので、Dockerfileを整えてみた。
https://github.com/umemak/docker-adminer/blob/master/4/Dockerfile
イメージサイズ800MB弱。 もっとスリム化できないかな。
昨日の続き。 とりあえず接続してテーブル一覧作ったりテーブル作成したりできた。
Adminer - Database management in a single PHP fileのDockerイメージAdminer - Official Image | Docker Hubは、Oracle接続に必要なモジュールが入っていない。
PHP: インストール/設定 - Manualによると、Instant Client for Linux x86-64 (64-bit)のBasicと、oci8が必要らしい。
DockerfileはOfficial ImageのTimWolla/docker-adminer: Database management in a single PHP fileを参考に。
Read morego-oci8を使ったイメージの、oraclelinux8をベースイメージにしたやつが1.25GB
にもなったので、もっと小さくならないか試してみた。
golang:1-bullseyeをベースにした場合、rpmが使えないのでOracleInstantClient関連のzipを展開する方法でやって、1.32GB
。増えてる。
昨日は、mattn/go-oci8: Oracle driver for Go using database/sqlとsijms/go-ora: Pure go oracle clientを使ったサンプルをコンテナ上でgo run
して動かしていた。
今日はgo build
でバイナリにして実行できるようにしてみる。
何もオプション付けずにビルドしたら、どちらも問題なし。
バイナリサイズを小さくしようと、-ldflags="-s -w -extldflags \"-static\""
をつけたところ、go-oraは大丈夫。go-oci8はNGだった。
docker-images/OracleDatabase/SingleInstance at main · oracle/docker-imagesはクライアント側みたいにビルド済みイメージが用意されていないのかな、と思ったらOracle Container Registryにそれらしいものを見つけた。
Home > Database > express
$ docker pull container-registry.oracle.com/database/express:latest
サイズやばい
$ docker images | grep ora
oraclelinux 8 3bbe8a2c4b82 9 days ago 226MB
oraclelinux 8-slim 1fcc1e6dda05 3 weeks ago 101MB
container-registry.oracle.com/database/express latest e986fd612413 2 months ago 11.2GB
$ docker run -d container-registry.oracle.com/database/express
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9c64bc970d7 container-registry.oracle.com/database/express "/bin/sh -c 'exec $O…" 56 seconds ago Up 55 seconds (health: starting) wizardly_dijkstra
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9c64bc970d7 container-registry.oracle.com/database/express "/bin/sh -c 'exec $O…" About a minute ago Up About a minute (healthy) wizardly_dijkstra
Statusがhalthyになるまで1分くらいかかった。
Read more前の記事でsqlplusで接続できたので、Goのプログラムから接続してみる。
instantclientベースでGoをインストールするDockerfile作成
FROM ghcr.io/oracle/oraclelinux8-instantclient:21
RUN yum install -y wget tar
RUN wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz
RUN rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
ENV PATH="${PATH}:/usr/local/go/bin"
CMD [ "go", "version" ]
docker-composeもそれを使うように修正
version: '3'
services:
db:
image: container-registry.oracle.com/database/express
ports:
- 1521:1521
environment:
- ORACLE_PWD=OraclePwd
cli:
build: .
image: oraclegocli
tty: true
command: bash
sijms/go-oraのサンプルファイルを拝借。 importの所はv2に修正。
sh-4.4# vi main.go
sh-4.4# go mod tidy
go: finding module for package github.com/sijms/go-ora/v2
go: downloading github.com/sijms/go-ora/v2 v2.4.24
go: found github.com/sijms/go-ora/v2 in github.com/sijms/go-ora/v2 v2.4.24
sh-4.4# go run main.go oracle://system:OraclePwd@db:1521/XE
Successfully connected.
接続はできているみたいだけど、SQLの実行結果が表示されない。。
Read moremattn/go-oci8: Oracle driver for Go using database/sqlでやってみる。
sh-4.4# go run go-oci8/main.go
# pkg-config --cflags -- oci8
pkg-config: exec: "pkg-config": executable file not found in $PATH
sh-4.4# yum install -y pkgconfig
sh-4.4# go run go-oci8/main.go
# pkg-config --cflags -- oci8
Package oci8 was not found in the pkg-config search path.
Perhaps you should add the directory containing `oci8.pc'
to the PKG_CONFIG_PATH environment variable
Package 'oci8', required by 'virtual:world', not found
pkg-config: exit status 1
とりあえずmain.goと同じところにoci8.pcを作成。中身はExamples。
sh-4.4# export PKG_CONFIG_PATH=.
sh-4.4# go run go-oci8/main.go
# github.com/mattn/go-oci8
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in $PATH
sh-4.4# yum install -y gcc
sh-4.4# go run go-oci8/main.go
# github.com/mattn/go-oci8
In file included from vendor/github.com/mattn/go-oci8/c_helpers.go:3:
./oci8.go.h:1:10: fatal error: oci.h: No such file or directory
#include <oci.h>
^~~~~~~
compilation terminated.
sh-4.4# find / | grep oci.h
/usr/include/oracle/21/client64/oci.h
oci8.pcのincludedirを/usr/include/oracle/21/client64に変更。
Read moreサーバー側:docker-images/OracleDatabase at main · oracle/docker-images
クライアント側:docker-images/OracleInstantClient at main · oracle/docker-images
ベースイメージはOraclelinux - Official Image | Docker Hubが使われている(結構でかい)。
$ docker images | grep ora
oraclelinux 8 3bbe8a2c4b82 6 days ago 226MB
oraclelinux 8-slim 1fcc1e6dda05 3 weeks ago 101MB
https://ochacafe.connpass.com/event/152768/
番外編の第1回。高可用性の話です。
きました pic.twitter.com/plY4jy7rsN
— umemak (@umemak8) November 29, 2019
ビール投入
Read more