在Go中连接到Oracle数据库

huangapple go评论133阅读模式
英文:

Connecting to Oracle DB in Go

问题

我正在尝试从 Windows(64 位 Go,32 位客户端)连接到 Oracle 数据库。

我已经参考了这个问题,但我对 Go 完全不熟悉,所以对他建议的配置一无所知。

我已经安装了多个客户端,例如:

  1. code.google.com\p\odbc
  2. github.com\mattn\go-oci8

我尝试创建 oci8.pc 文件,但似乎有问题。

  1. prefix=/devel/target/1.0
  2. exec_prefix=${prefix}
  3. libdir=C:/oracle/instantclient_12_1/sdk/lib/msvc
  4. includedir=C:/oracle/instantclient_12_1/sdk/include
  5. oralib=C:/oracle/instantclient_12_1/sdk/lib/msvc
  6. orainclude=C:/oracle/instantclient_12_1/sdk/include
  7. gcclib=C:/TDM-GCC-64/lib
  8. gccinclude=C:/TDM-GCC-64/include
  9. glib_genmarshal=glib-genmarshal
  10. gobject_query=gobject-query
  11. glib_mkenums=glib-mkenums
  12. Name: oci8
  13. Version: 12.1
  14. Description: oci8 library
  15. Libs: -L${oralib} -L${gcclib} -loci
  16. Libs.private:
  17. Cflags: -I${orainclude} -I${gccinclude}

当我运行以下代码时,出现错误:

  1. // TestDB
  2. package main
  3. import (
  4. "github.com/odbc"
  5. )
  6. func main() {
  7. conn, _ := odbc.Connect("DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXXX;PWD=XXXXX")
  8. defer conn.Close()
  9. stmt, _ := conn.Prepare("select * from XXXXX where XXXX = ?")
  10. defer stmt.Close()
  11. stmt.Execute("100044")
  12. rows, _ := stmt.FetchAll()
  13. for i, row := range rows {
  14. println(i, row)
  15. }
  16. }

错误信息如下:

  1. panic: runtime error: invalid memory address or nil pointer dereference
  2. panic: runtime error: invalid memory address or nil pointer dereference
  3. [signal 0xc0000005 code=0x0 addr=0x8 pc=0x43c3a6]
  4. goroutine 1 [running]:
  5. github.com/odbc.(*Connection).Close(0x0, 0x45)
  6. C:/Go/UDL/src/github.com/odbc/odbc.go:263 +0x26
  7. github.com/odbc.(*Connection).newStmt(0x0, 0x36, 0xc0820120e0)
  8. C:/Go/UDL/src/github.com/odbc/odbc.go:152 +0x50
  9. github.com/odbc.(*Connection).Prepare(0x0, 0x51cf70, 0x36, 0x0, 0x0, 0x0, 0xc082005e90, 0x9d6eb0)
  10. C:/Go/UDL/src/github.com/odbc/odbc.go:162 +0x51
  11. main.main()
  12. C:/Go/My Codes/new/TestDB.go:12 +0xc4
  13. goroutine 17 [syscall, locked to thread]:
  14. runtime.goexit()
  15. c:/go/src/runtime/asm_amd64.s:2232 +0x1

我是否遗漏了什么?如果有人能指导我正确的方向,我将非常感激。

提前感谢。

编辑:

在浏览更多内容后,我将代码更改如下:

  1. // TestDB
  2. package main
  3. import (
  4. _ "code.google.com/p/odbc"
  5. "database/sql"
  6. "fmt"
  7. )
  8. func main() {
  9. fmt.Println(sql.Drivers())
  10. db, err := sql.Open("odbc","DSN=lnxcepd1db01.xxxx.com:51521*CBPDEV;UID=XXXX;PWD=XXXX")
  11. if err != nil {
  12. panic(err)
  13. }
  14. rows, err := db.Query("select TABLE_NAME from tabs")
  15. var TABLE_NAME string
  16. defer rows.Close()
  17. for rows.Next() {
  18. fmt.Println(rows.Columns())
  19. rows.Scan(&TABLE_NAME)
  20. fmt.Println(TABLE_NAME)
  21. }
  22. err = rows.Err()
  23. if err != nil {
  24. panic(err)
  25. }
  26. defer db.Close()
  27. }

输出和错误堆栈如下:

  1. [odbc]
  2. panic: runtime error: invalid memory address or nil pointer dereference
  3. panic: runtime error: invalid memory address or nil pointer dereference
  4. [signal 0xc0000005 code=0x0 addr=0x20 pc=0x453408]
  5. goroutine 1 [running]:
  6. database/sql.(*Rows).Close(0x0, 0x0, 0x0)
  7. c:/go/src/database/sql/sql.go:1659 +0x38
  8. database/sql.(*Rows).Next(0x0, 0xc082002400)
  9. c:/go/src/database/sql/sql.go:1586 +0x2c
  10. main.main()
  11. C:/Go/My Codes/new/TestDB.go:23 +0x263
  12. goroutine 2 [runnable]:
  13. runtime.forcegchelper()
  14. c:/go/src/runtime/proc.go:90
  15. runtime.goexit()
  16. c:/go/src/runtime/asm_amd64.s:2232 +0x1
  17. goroutine 3 [runnable]:
  18. runtime.bgsweep()
  19. c:/go/src/runtime/mgc0.go:82
  20. runtime.goexit()
  21. c:/go/src/runtime/asm_amd64.s:2232 +0x1
  22. goroutine 4 [runnable]:
  23. runtime.runfinq()
  24. c:/go/src/runtime/malloc.go:712
  25. runtime.goexit()
  26. c:/go/src/runtime/asm_amd64.s:2232 +0x1
  27. goroutine 5 [runnable]:
  28. database/sql.(*DB).connectionOpener(0xc08205a000)
  29. c:/go/src/database/sql/sql.go:588
  30. created by database/sql.Open
  31. c:/go/src/database/sql/sql.go:452 +0x323

如你所见,当我打印可用的驱动程序时,我得到了 odbc,我不确定我遗漏了什么。

我正在使用这个 odbc 驱动程序。

https://code.google.com/p/odbc/wiki/GettingStartedOnWindows

我注意到一件事:

当我使用以下代码时:

  1. db, err := sql.Open("odbc", "DSN=lnxcepd1db01.XXXXXX.com:51521;USERID=XXXX;PASSWORD=XXXX;DATABASE=CBPDEV")

我得到以下错误:

  1. %v SQLDriverConnect: {IM002} [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

当我尝试:

  1. db, err := sql.Open("odbc", "DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXX;PWD=XXXXX")

我得到错误:

  1. SQLDriverConnect: {IM010} [Microsoft][ODBC Driver Manager] Data source name too long

还有这个:

  1. db, err := sql.Open("odbc","DSN=lnxcepd1db01.XXXXX.com:51521*cbpdev;UID=XXX;PWD=XXXX")

错误:

  1. SQLDriverConnect: {IM010} [Microsoft][ODBC Driver Manager] Data source name too long

我完全迷失了,因为我无法将其与驱动程序问题、代码问题或连接字符串中缺少某些参数联系起来。

我有以下问题:

我的连接字符串有什么问题?有人有一个可用的设置或从构建 API 开始的说明吗(很抱歉,但我尝试了一些但没有成功)?哪个 API 更好或更容易使用?

英文:

I am trying to connect to Oracle DB from Windows (64 bit Go, 32 bit client)

I already reffered this question but I am completely new to Go so I am clueless about the configuration he suggested.

I have installed multiple clients, such as:

  1. 1. `code.google.com\p\odbc`
  2. 2. `github.com\mattn\go-oci8`

I tried to create the oci8.pc file but it seems it is wrong.

  1. prefix=/devel/target/1.0
  2. exec_prefix=${prefix}
  3. libdir=C:/oracle/instantclient_12_1/sdk/lib/msvc
  4. includedir=C:/oracle/instantclient_12_1/sdk/include
  5. oralib=C:/oracle/instantclient_12_1/sdk/lib/msvc
  6. orainclude=C:/oracle/instantclient_12_1/sdk/include
  7. gcclib=C:/TDM-GCC-64/lib
  8. gccinclude=C:/TDM-GCC-64/include
  9. glib_genmarshal=glib-genmarshal
  10. gobject_query=gobject-query
  11. glib_mkenums=glib-mkenums
  12. Name: oci8
  13. Version: 12.1
  14. Description: oci8 library
  15. Libs: -L${oralib} -L${gcclib} -loci
  16. Libs.private:
  17. Cflags: -I${orainclude} -I${gccinclude}

When I run the following code, I get error:

  1. // TestDB
  2. package main
  3. import (
  4. "github.com/odbc"
  5. )
  6. func main() {
  7. conn, _ := odbc.Connect("DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXXX;PWD=XXXXX")
  8. defer conn.Close()
  9. stmt, _ := conn.Prepare("select * from XXXXX where XXXX = ?")
  10. defer stmt.Close()
  11. stmt.Execute("100044")
  12. rows, _ := stmt.FetchAll()
  13. for i, row := range rows {
  14. println(i, row)
  15. }
  16. }

Error:

  1. panic: runtime error: invalid memory address or nil pointer dereference
  2. panic: runtime error: invalid memory address or nil pointer dereference
  3. [signal 0xc0000005 code=0x0 addr=0x8 pc=0x43c3a6]
  4. goroutine 1 [running]:
  5. github.com/odbc.(*Connection).Close(0x0, 0x45)
  6. C:/Go/UDL/src/github.com/odbc/odbc.go:263 +0x26
  7. github.com/odbc.(*Connection).newStmt(0x0, 0x36, 0xc0820120e0)
  8. C:/Go/UDL/src/github.com/odbc/odbc.go:152 +0x50
  9. github.com/odbc.(*Connection).Prepare(0x0, 0x51cf70, 0x36, 0x0, 0x0, 0x0, 0xc082005e90, 0x9d6eb0)
  10. C:/Go/UDL/src/github.com/odbc/odbc.go:162 +0x51
  11. main.main()
  12. C:/Go/My Codes/new/TestDB.go:12 +0xc4
  13. goroutine 17 [syscall, locked to thread]:
  14. runtime.goexit()
  15. c:/go/src/runtime/asm_amd64.s:2232 +0x1

Am I missing anything? If anybody can point me into right direction, I will be really greatful.

Thanks in advance.

EDIT:

After browsing more I changed my code as follows:

  1. // TestDB
  2. package main
  3. import (
  4. _ "code.google.com/p/odbc"
  5. "database/sql"
  6. "fmt"
  7. )
  8. func main() {
  9. fmt.Println(sql.Drivers())
  10. db, err := sql.Open("odbc","DSN=lnxcepd1db01.xxxx.com:51521*CBPDEV;UID=XXXX;PWD=XXXX")
  11. if err != nil {
  12. panic(err)
  13. }
  14. rows, err := db.Query("select TABLE_NAME from tabs")
  15. var TABLE_NAME string
  16. defer rows.Close()
  17. for rows.Next() {
  18. fmt.Println(rows.Columns())
  19. rows.Scan(&TABLE_NAME)
  20. fmt.Println(TABLE_NAME)
  21. }
  22. err = rows.Err()
  23. if err != nil {
  24. panic(err)
  25. }
  26. defer db.Close()
  27. }

The output + error stack:

  1. [odbc]
  2. panic: runtime error: invalid memory address or nil pointer dereference
  3. panic: runtime error: invalid memory address or nil pointer dereference
  4. [signal 0xc0000005 code=0x0 addr=0x20 pc=0x453408]
  5. goroutine 1 [running]:
  6. database/sql.(*Rows).Close(0x0, 0x0, 0x0)
  7. c:/go/src/database/sql/sql.go:1659 +0x38
  8. database/sql.(*Rows).Next(0x0, 0xc082002400)
  9. c:/go/src/database/sql/sql.go:1586 +0x2c
  10. main.main()
  11. C:/Go/My Codes/new/TestDB.go:23 +0x263
  12. goroutine 2 [runnable]:
  13. runtime.forcegchelper()
  14. c:/go/src/runtime/proc.go:90
  15. runtime.goexit()
  16. c:/go/src/runtime/asm_amd64.s:2232 +0x1
  17. goroutine 3 [runnable]:
  18. runtime.bgsweep()
  19. c:/go/src/runtime/mgc0.go:82
  20. runtime.goexit()
  21. c:/go/src/runtime/asm_amd64.s:2232 +0x1
  22. goroutine 4 [runnable]:
  23. runtime.runfinq()
  24. c:/go/src/runtime/malloc.go:712
  25. runtime.goexit()
  26. c:/go/src/runtime/asm_amd64.s:2232 +0x1
  27. goroutine 5 [runnable]:
  28. database/sql.(*DB).connectionOpener(0xc08205a000)
  29. c:/go/src/database/sql/sql.go:588
  30. created by database/sql.Open
  31. c:/go/src/database/sql/sql.go:452 +0x323

As you can see, when I am printing the available Drivers, I am getting odbc, I am not sure what I am missing.

I am using this odbc driver.

https://code.google.com/p/odbc/wiki/GettingStartedOnWindows

I noticed 1 thing:

When I use

  1. db, err := sql.Open("odbc", "DSN=lnxcepd1db01.XXXXX.com:51521;USERID=XXXX;PASSWORD=XXXX;DATABASE=CBPDEV")

I get error as,

  1. %v SQLDriverConnect: {IM002} [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

When I try,

  1. db, err := sql.Open("odbc", "DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXX;PWD=XXXXX")

I get error:

  1. SQLDriverConnect: {IM010} [Microsoft][ODBC Driver Manager] Data source name too long

And this one as well:

  1. db, err := sql.Open("odbc","DSN=lnxcepd1db01.XXXXX.com:51521*cbpdev;UID=XXX;PWD=XXXX")

Error:

  1. SQLDriverConnect: {IM010} [Microsoft][ODBC Driver Manager] Data source name too long

I am completely lost as I cannot relate this to a driver issue, my code issue or I am missing some parameters in connection string.

I have the following questions :

Whats is wrong with my Connection String?
Does anyone has a working setup or instructions to be carried out starting from API building (I am sorry but I tried a few but no luck)??
Which API is better or easier to use ?

答案1

得分: 2

以下是一个完成连接/准备/查询/获取操作的函数:

  1. func getDatePrepQuery(driver string, connString string) error {
  2. db, err := sql.Open(driver, connString)
  3. if err != nil {
  4. log.Printf("sql.Open(%s, %s)\n\t%s\n",
  5. driver, connString, err.Error())
  6. return err
  7. }
  8. defer db.Close()
  9. query := "select SYSDATE from dual"
  10. stmt, err := db.Prepare(query)
  11. if err != nil {
  12. log.Printf("db.Prepare(%s) failed.\n\t%s\n", query, err.Error())
  13. return err
  14. }
  15. defer stmt.Close()
  16. rows, err := stmt.Query()
  17. if err != nil {
  18. log.Printf("stmt.Query() failed.\n\t%s\n", err.Error())
  19. return err
  20. }
  21. defer rows.Close()
  22. var columns []string
  23. columns, err = rows.Columns()
  24. if err != nil {
  25. log.Printf("rows.Columns() failed.\n\t%s\n", err.Error())
  26. }
  27. for i, c := range columns {
  28. fmt.Printf("%3d %s\n", i, c)
  29. }
  30. for rows.Next() {
  31. var sysdate time.Time
  32. err = rows.Scan(&sysdate)
  33. if err != nil {
  34. log.Printf("rows.Scan(...) failed.\n\t%s\n", err.Error())
  35. return err
  36. }
  37. fmt.Println("SYSDATE:", sysdate)
  38. }
  39. err = rows.Err()
  40. if err != nil {
  41. log.Printf("rows iteration failed.\n\t%s\n", err.Error())
  42. return err
  43. }
  44. return nil
  45. }

使用Scan是一个棘手的部分,因为它可能不是Oracle程序员所习惯的。这个函数对我尝试过的所有odbc、mgodbc、oci8、adodb和goracle包都有效。

英文:

here is a function to do a complete conn/prep/query/fetch operation:

  1. func getDatePrepQuery(driver string, connString string) error {
  2. db, err := sql.Open(driver, connString)
  3. if err != nil {
  4. log.Printf("sql.Open(%s, %s)\n\t%s\n",
  5. driver, connString, err.Error())
  6. return err
  7. }
  8. defer db.Close()
  9. query := "select SYSDATE from dual"
  10. stmt, err := db.Prepare(query)
  11. if err != nil {
  12. log.Printf("db.Prepare(%s) failed.\n\t%s\n", query, err.Error())
  13. return err
  14. }
  15. defer stmt.Close()
  16. rows, err := stmt.Query()
  17. if err != nil {
  18. log.Printf("stmt.Query() failed.\n\t%s\n", err.Error())
  19. return err
  20. }
  21. defer rows.Close()
  22. var columns []string
  23. columns, err = rows.Columns()
  24. if err != nil {
  25. log.Printf("rows.Columns() failed.\n\t%s\n", err.Error())
  26. }
  27. for i, c := range columns {
  28. fmt.Printf("%3d %s\n", i, c)
  29. }
  30. for rows.Next() {
  31. var sysdate time.Time
  32. err = rows.Scan(&sysdate)
  33. if err != nil {
  34. log.Printf("rows.Scan(...) failed.\n\t%s\n", err.Error())
  35. return err
  36. }
  37. fmt.Println("SYSDATE:", sysdate)
  38. }
  39. err = rows.Err()
  40. if err != nil {
  41. log.Printf("rows iteration failed.\n\t%s\n", err.Error())
  42. return err
  43. }
  44. return nil
  45. }

Using Scan is the tricky part as it may not be something Oracle programmers are used to. This function worked for all of the odbc, mgodbc, oci8, adodb and goracle packages that I tried.

答案2

得分: 0

你收到的错误提示表示你正在尝试在未初始化的变量(nil值)上访问一个“方法”。
在使用返回的值之前,你应该检查是否有错误。

  1. package main
  2. import (
  3. "github.com/odbc"
  4. "log"
  5. )
  6. func main() {
  7. conn, err := odbc.Connect("DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXXX;PWD=XXXXX")
  8. if err != nil {
  9. log.Println(log)
  10. return
  11. }
  12. defer conn.Close()
  13. stmt, err := conn.Prepare("select * from XXXXX where XXXX = ?")
  14. if err != nil {
  15. log.Println(log)
  16. return
  17. }
  18. defer stmt.Close()
  19. stmt.Execute("100044")
  20. rows, _ := stmt.FetchAll()
  21. for i, row := range rows {
  22. println(i, row)
  23. }
  24. }
英文:

The error you get says you are trying to access a "method" on an non-initialised variable (nil value).
You should check you have no errors before using the values you get back.

  1. package main
  2. import (
  3. "github.com/odbc"
  4. "log"
  5. )
  6. func main() {
  7. conn, err := odbc.Connect("DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXXX;PWD=XXXXX")
  8. if err != nil {
  9. log.Println(log)
  10. return
  11. }
  12. defer conn.Close()
  13. stmt, err := conn.Prepare("select * from XXXXX where XXXX = ?")
  14. if err != nil {
  15. log.Println(log)
  16. return
  17. }
  18. defer stmt.Close()
  19. stmt.Execute("100044")
  20. rows, _ := stmt.FetchAll()
  21. for i, row := range rows {
  22. println(i, row)
  23. }
  24. }

答案3

得分: 0

这篇博客:https://blogs.oracle.com/developers/developing-microservices-in-java%2c-javascript%2c-python%2c-net%2c-and-go-with-the-oracle-converged-database

以及它指向的研讨会和代码库,特别是https://github.com/oracle/microservices-datadriven/tree/main/grabdish/inventory-go,可能会有所帮助。

以下是其中一部分显示工作源代码和Dockerfile的片段...

源代码...

  1. import (
  2. "context"
  3. "database/sql"
  4. "github.com/godror/godror"
  5. )
  6. user := os.Getenv("DB_USER")
  7. dbpassword := os.Getenv("DB_PASSWORD")
  8. connectString := os.Getenv("DB_CONNECT_STRING") //例如 "examplepdb_tp"
  9. connectionString := user + "/" + dbpassword + "@" + connectString
  10. connection, err := sql.Open("godror", connectionString)

Dockerfile...

  1. FROM alpine:latest
  2. ENV LD_LIBRARY_PATH=/lib
  3. RUN wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  4. unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  5. cp -r instantclient_19_3/* /lib && \
  6. rm -rf instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  7. apk add libaio && \
  8. apk add libaio libnsl libc6-compat
  9. RUN cd /lib
  10. RUN ln -s /lib64/* /lib
  11. RUN ln -s libnsl.so.2 /usr/lib/libnsl.so.1
  12. RUN ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2
  13. COPY /go/bin/inventory-go /usr/lib/inventory-go
  14. ENTRYPOINT ["/usr/lib/inventory-go"]

Dockerfile(包括构建)...

  1. FROM golang:alpine AS builder
  2. RUN apk update && apk add --no-cache git build-base
  3. WORKDIR /src
  4. COPY . .
  5. RUN go get -d -v
  6. RUN go build -o /go/bin/inventory-go
  7. FROM alpine:latest
  8. ENV LD_LIBRARY_PATH=/lib
  9. RUN wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  10. unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  11. cp -r instantclient_19_3/* /lib && \
  12. rm -rf instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  13. apk add libaio && \
  14. apk add libaio libnsl libc6-compat
  15. RUN cd /lib
  16. RUN ln -s /lib64/* /lib
  17. RUN ln -s libnsl.so.2 /usr/lib/libnsl.so.1
  18. RUN ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2
  19. COPY --from=builder /go/bin/inventory-go /usr/lib/inventory-go
  20. ENTRYPOINT ["/usr/lib/inventory-go"]
英文:

This blog: https://blogs.oracle.com/developers/developing-microservices-in-java%2c-javascript%2c-python%2c-net%2c-and-go-with-the-oracle-converged-database

and the workshop and repos it points to, specifically https://github.com/oracle/microservices-datadriven/tree/main/grabdish/inventory-go , might be of help.

Here is a snippet from it showing working src and dockerfile...

source...

  1. import (
  2. "context"
  3. "database/sql"
  4. "github.com/godror/godror"
  5. )
  6. user := os.Getenv("DB_USER")
  7. dbpassword := os.Getenv("DB_PASSWORD")
  8. connectString := os.Getenv("DB_CONNECT_STRING") //for example "examplepdb_tp"
  9. connectionString := user + "/" + dbpassword + "@" + connectString
  10. connection, err := sql.Open("godror", connectionString)

Dockerfile...

  1. FROM alpine:latest
  2. ENV LD_LIBRARY_PATH=/lib
  3. RUN wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  4. unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  5. cp -r instantclient_19_3/* /lib && \
  6. rm -rf instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  7. apk add libaio && \
  8. apk add libaio libnsl libc6-compat
  9. RUN cd /lib
  10. RUN ln -s /lib64/* /lib
  11. RUN ln -s libnsl.so.2 /usr/lib/libnsl.so.1
  12. RUN ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2
  13. COPY /go/bin/inventory-go /usr/lib/inventory-go
  14. ENTRYPOINT ["/usr/lib/inventory-go"]
  15. Dockerfile (including build)...
  16. FROM golang:alpine AS builder
  17. RUN apk update && apk add --no-cache git build-base
  18. WORKDIR /src
  19. COPY . .
  20. RUN go get -d -v
  21. RUN go build -o /go/bin/inventory-go
  22. FROM alpine:latest
  23. ENV LD_LIBRARY_PATH=/lib
  24. RUN wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  25. unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  26. cp -r instantclient_19_3/* /lib && \
  27. rm -rf instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
  28. apk add libaio && \
  29. apk add libaio libnsl libc6-compat
  30. RUN cd /lib
  31. RUN ln -s /lib64/* /lib
  32. RUN ln -s libnsl.so.2 /usr/lib/libnsl.so.1
  33. RUN ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2
  34. COPY --from=builder /go/bin/inventory-go /usr/lib/inventory-go
  35. ENTRYPOINT ["/usr/lib/inventory-go"]

huangapple
  • 本文由 发表于 2015年5月5日 10:54:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/30043488.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定