Skip to content

Docker

host.docker.internalとlinux

Docker Desktopでは、host.docker.internalで母艦のIPアドレスが参照できるようになっているのだけど、Docker DesktopではないLinux環境だと使えない。

で、とりあえず172.17.0.1でやってたりするのだけど、これだとうまくいかないときがあるっぽい。

推測調なのは、まだ手元で再現できていないから。

Read more

OracleにGoで接続するイメージの軽量化

go-oci8を使ったイメージの、oraclelinux8をベースイメージにしたやつが1.25GBにもなったので、もっと小さくならないか試してみた。

golang:1-bullseyeをベースにした場合、rpmが使えないのでOracleInstantClient関連のzipを展開する方法でやって、1.32GB。増えてる。

Read more

OracleにGoで接続する3

昨日は、mattn/go-oci8: Oracle driver for Go using database/sqlsijms/go-ora: Pure go oracle clientを使ったサンプルをコンテナ上でgo runして動かしていた。

今日はgo buildでバイナリにして実行できるようにしてみる。

何もオプション付けずにビルドしたら、どちらも問題なし。

バイナリサイズを小さくしようと、-ldflags="-s -w -extldflags \"-static\""をつけたところ、go-oraは大丈夫。go-oci8はNGだった。

Read more

OracleサーバーのDockerイメージ

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

OracleにGoで接続する

前の記事で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 more

OracleにGoで接続する2

mattn/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

OracleのDockerイメージ

oracle/docker-images: Official source for Docker configurations, images, and examples of Dockerfiles for Oracle products and projects にまとめられている。

サーバー側: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