2016-08-19 120 views
3

我試圖連接一個go和一個postgres容器和docker-compose。連接go和postgres與docker-compose

這裏是我的搬運工,compose.yml:

version: '2' 
services: 
    postgres: 
     image: postgres 
     ports: 
      - "5432" 
     environment: 
      - POSTGRES_PASSWORD=postgres 
    server: 
     build: ./server 
     command: gin 
     volumes: 
      - ./server:/go/src/app 
     ports: 
      - "8080:3000" 

起初我用的鏈接試圖在泊塢窗,compose.yml命令,但沒有在服務器容器創建任何ENV變量,所以讓我很困惑。 (它應該創建SOMETHINGSOMETHING_PORT_5432_TCP_ADDR和SOMETHINGSOMETHING_5432_TCP_PORT,不是嗎?)

然後我讀的地方,我可以只使用http://postgres作爲東道主,所以我試過了。所以現在這是我的main.go看起來像(注:我使用的GORP「ORM」):

func main() { 

    dbinfo := fmt.Sprintf("user=%s password=%s host=%s dbname=%s sslmode=disable", 
     "postgres", 
     os.Getenv("DB_ENV_POSTGRES_PASSWORD"), 
     "http://postgres", 
     DB_NAME, 
    ) 

    db, err := sql.Open("postgres", dbinfo) 

    checkErr(err, "sql.Open failed") 


    // construct a gorp DbMap 
    dbmap := &gorp.DbMap{Db: db, Dialect: gorp.PostgresDialect{}} 

    // add a table, setting the table name to 'posts' and 
    // specifying that the Id property is an auto incrementing PK 
    dbmap.AddTableWithName(Todo{}, "todos").SetKeys(true, "Id") 

    // create the table. in a production system you'd generally 
    // use a migration tool, or create the tables via scripts 
    err = dbmap.CreateTablesIfNotExists() 
    checkErr(err, "Create tables failed") 

    http.HandleFunc("/", handler) 
    http.ListenAndServe(":3001", nil) 
} 

下面是詳細的日誌泊塢窗,構成了(我得到拒絕連接端口5432) :

←[36mserver_1 |←[0m [gin] listening on port 3000 
←[33mpostgres_1 |←[0m The files belonging to this database system will be owned by user "postgres". 
←[33mpostgres_1 |←[0m This user must also own the server process. 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m The database cluster will be initialized with locale "en_US.utf8". 
←[33mpostgres_1 |←[0m The default database encoding has accordingly been set to "UTF8". 
←[33mpostgres_1 |←[0m The default text search configuration will be set to "english". 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m Data page checksums are disabled. 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m fixing permissions on existing directory /var/lib/postgresql/data ... ok 
←[33mpostgres_1 |←[0m creating subdirectories ... ok 
←[33mpostgres_1 |←[0m selecting default max_connections ... 100 
←[33mpostgres_1 |←[0m selecting default shared_buffers ... 128MB 
←[33mpostgres_1 |←[0m selecting dynamic shared memory implementation ... posix 
←[33mpostgres_1 |←[0m creating configuration files ... ok 
←[33mpostgres_1 |←[0m creating template1 database in /var/lib/postgresql/data/base/1 ... ok 
←[33mpostgres_1 |←[0m initializing pg_authid ... ok 
←[33mpostgres_1 |←[0m initializing dependencies ... ok 
←[33mpostgres_1 |←[0m creating system views ... ok 
←[33mpostgres_1 |←[0m loading system objects' descriptions ... ok 
←[33mpostgres_1 |←[0m creating collations ... ok 
←[33mpostgres_1 |←[0m creating conversions ... ok 
←[33mpostgres_1 |←[0m creating dictionaries ... ok 
←[33mpostgres_1 |←[0m setting privileges on built-in objects ... ok 
←[33mpostgres_1 |←[0m creating information schema ... ok 
←[33mpostgres_1 |←[0m loading PL/pgSQL server-side language ... ok 
←[33mpostgres_1 |←[0m vacuuming database template1 ... ok 
←[33mpostgres_1 |←[0m copying template1 to template0 ... ok 
←[33mpostgres_1 |←[0m copying template1 to postgres ... ok 
←[33mpostgres_1 |←[0m syncing data to disk ... ok 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m WARNING: enabling "trust" authentication for local connections 
←[33mpostgres_1 |←[0m You can change this by editing pg_hba.conf or using the option -A, or 
←[33mpostgres_1 |←[0m --auth-local and --auth-host, the next time you run initdb. 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m Success. You can now start the database server using: 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m  pg_ctl -D /var/lib/postgresql/data -l logfile start 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m waiting for server to start....LOG: database system was shut down at 2016-08-19 18:31:55 UTC 
←[33mpostgres_1 |←[0m LOG: MultiXact member wraparound protections are now enabled 
←[33mpostgres_1 |←[0m LOG: database system is ready to accept connections 
←[33mpostgres_1 |←[0m LOG: autovacuum launcher started 
←[33mpostgres_1 |←[0m done 
←[33mpostgres_1 |←[0m server started 
←[33mpostgres_1 |←[0m ALTER ROLE 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m /docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m LOG: received fast shutdown request 
←[33mpostgres_1 |←[0m LOG: aborting any active transactions 
←[33mpostgres_1 |←[0m LOG: autovacuum launcher shutting down 
←[33mpostgres_1 |←[0m LOG: shutting down 
←[33mpostgres_1 |←[0m waiting for server to shut down....LOG: database system is shut down 
←[33mpostgres_1 |←[0m done 
←[33mpostgres_1 |←[0m server stopped 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m PostgreSQL init process complete; ready for start up. 
←[33mpostgres_1 |←[0m 
←[33mpostgres_1 |←[0m LOG: database system was shut down at 2016-08-19 18:31:57 UTC 
←[33mpostgres_1 |←[0m LOG: MultiXact member wraparound protections are now enabled 
←[33mpostgres_1 |←[0m LOG: database system is ready to accept connections 
←[33mpostgres_1 |←[0m LOG: autovacuum launcher started 
←[36mserver_1 |←[0m 2016/08/19 18:32:05 Create tables failed dial tcp [::1]:5432: getsockopt: connection refused 
←[36mserver_1 |←[0m 2016/08/19 18:32:05 http: proxy error: dial tcp [::1]:3001: getsockopt: connection refused 
←[36mserver_1 |←[0m 2016/08/19 18:32:05 Create tables failed dial tcp [::1]:5432: getsockopt: connection refused 
←[36mserver_1 |←[0m 2016/08/19 18:32:05 http: proxy error: dial tcp [::1]:3001: getsockopt: connection refused 

所以我的問題是我如何得到這些能夠彼此交談,我在這裏做錯了什麼?

+0

嘗試'sql.open(「postgres」,「postgres:// postgres/yourdbname」)' – Plato

回答

1

因爲我實際上並沒有鏈接容器,os.Getenv(「DB_EN​​V_POSTGRES_PASSWORD」)產生一個空字符串。在docker-compose.yml的服務器容器中添加一個帶密碼的環境變量,現在我可以連接到我的數據庫。

4

這是一個碼頭網絡question.You可以閱讀更多關於它here. 碼頭dns做了所有的辛勤工作,所以你可以達到每個容器的名稱,你給它在撰寫文件。

Posgres的URL通常就像

postgresql://user:[email protected]:port/database 

那麼對你來說,這會是這樣的。

db, err := sql.Open("postgres", "postgresql://user:[email protected]/mydatabase) 

請注意,如果postgres位於標準端口(5432)上,則不需要端口。

+1

謝謝,這是有幫助的:) – Nirri

+0

@Nirri你介意接受這是正確的答案嗎? – CESCO