xtr*_*nch 4 postgresql go docker 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"
Run Code Online (Sandbox Code Playgroud)
刚开始,我尝试使用docker-compose.yml中的links命令,但这并没有在服务器容器中创建任何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)
}
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
所以我的问题是我如何才能使它们能够互相交谈,而我在这里究竟在做什么错呢?
这是一个docker联网问题。您可以在此处了解更多信息。 Docker dns会进行所有艰苦的工作,因此您可以通过在撰写文件中为其指定的名称访问每个容器。
Posgres网址通常像
postgresql://user:password@ip:port/database
Run Code Online (Sandbox Code Playgroud)
所以对你来说,就像是。
db, err := sql.Open("postgres", "postgresql://user:password@postgres/mydatabase)
Run Code Online (Sandbox Code Playgroud)
请注意,如果postgres位于标准端口(5432)上,则不需要该端口。
事实证明,由于我实际上并未链接容器,因此 os.Getenv("DB_ENV_POSTGRES_PASSWORD") 生成了一个空字符串。在 docker-compose.yml 中向服务器容器添加了带有密码的环境变量,现在我可以连接到我的数据库。
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |