2016-08-19 3 views
3

Я пытаюсь подключить кэш и контейнер postgres с компоновкой докеров.Подключение go и postgres with 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 для «ОРМ»):

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

try 'sql.Open (" postgres "," postgres: // postgres/yourdbname ")' – Plato

ответ

1

Оказывается, поскольку я фактически не связываю контейнеры, os.Getenv ("DB_ENV_POSTGRES_PASSWORD") создавал пустую строку. Добавлена ​​переменная среды с паролем в контейнер сервера в файле docker-compose.yml, и теперь я могу подключиться к моей базе данных.

4

Это вопрос сетевой док-станции. Вы можете узнать больше об этом here. Docker 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

Смежные вопросы