连接go和postgres与docker-compose

我试图用docker-compose连接一个go和一个postgres容器。

这是我的docker-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" 

起初,我试图用docker-compose.yml中的links命令,但是没有在服务器容器中创build任何envvariables,所以让我感到困惑。 (它应该创buildSOMETHINGSOMETHING_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) } 

以下是docker-compose up的详细日志(我在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 

所以我的问题是如何让这些能够互相交谈,我在这里做错了什么?

这是一个docker联网的问题。你可以在这里阅读更多关于它的信息。 Docker的dns完成所有的工作,所以你可以通过在撰写文件中给出的名字来访问每个容器。

Posgresurl通常工作

 postgresql://user:password@ip:port/database 

所以对你来说,就是这样。

 db, err := sql.Open("postgres", "postgresql://user:password@postgres/mydatabase) 

请注意,如果postgres位于标准端口(5432)上,则不需要该端口。

因为我实际上并没有链接容器,os.Getenv(“DB_EN​​V_POSTGRES_PASSWORD”)产生一个空string。 在docker-compose.yml中添加一个带有密码的环境variables到服务器容器,现在我可以连接到我的数据库。