2014-12-28 5 views
17

Ho creato un contenitore postgres utilizzando il tutorial su fig website. Ho chiamato il contenitore db.Come accedere a psql di un contenitore di Postgres in esecuzione?

Il contenitore è in esecuzione e la mia app si collega correttamente. Ho cercato di eseguire il comando fig run db psql con la db contenitore corsa e ottenuto l'errore:

psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Come posso ottenere nell'interfaccia psql in corsa db contenitore?

risposta

26

fig creerà un contenitore finestra mobile con un nome diverso da quello utilizzato nel file fig.yml.

Ho ottenuto il lavoro trovando il nome del contenitore con docker ps e guardando la colonna NAMES.

Poi l'esecuzione del comando psql nel contenitore in esecuzione con docker exec -ti NAME_OF_CONTAINER psql -U YOUR_POSTGRES_USERNAME

Nota che docker exec corre il comando psql su un contenitore in esecuzione, al contrario di docker run che inizierà un nuovo contenitore.


Aggiornamento

fig è ora chiamato docker-compose

+0

Buona risposta! È molto importante distinguere tra 'docker run ' e 'docker exec '. Si può anche semplicemente "finestra mobile exec -it/bin/bash' ** per lo sviluppo **. – schmunk

+0

È necessario eseguire il dump dei dati, impossibile eseguire exec docker -it – rocketspacer

1

È necessario eseguire un nuovo contenitore per la connessione a quello iniziato da fig. Questo perché il contenitore principale per default avvia il servizio, e se lo fai, fig run db psql fig NON inizierà il servizio ma eseguirà invece il client psql. Vedi the Dockerfile.

Quindi per connettersi al servizio PostgreSQL è necessario eseguire un altro contenitore collegato a quello avviato da fig. Vedi https://registry.hub.docker.com/_/postgres/.

Innanzitutto, poiché la fig cambia i nomi dei contenitori avviati, controllare la colonna NAMES del contenitore docker ps dopo aver eseguito fig up. Poi:

docker run -it --link <postgres_container_name>:postgres --rm postgres sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

Si può fare lo docker exec trucco così come desribed da @sargas troppo, ma il modo che collega i suoni più canonica per me.

+1

Il flag --link è una funzione legacy obsoleta di Docker: https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/ –

1

È possibile pubblicare il risultato di docker ps? La mia ipotesi è che è necessario specificare la porta che il contenitore postgres sta esponendo. Esecuzione docker ps dovrebbe darvi

CONTAINER ID  IMAGE       COMMAND    CREATED    STATUS    PORTS     NAMES 
948b1f6ebc0a  my_postgres:latest   "/usr/lib/postgresql 6 days ago   Up 6 days   0.0.0.0:49155->5432/tcp db 

e guardando sotto la colonna porte per il vostro contenitore db vedrete la porta il db è effettivamente esposta su. In questo caso è 49155, ma la finestra mobile sceglierà una porta casuale tra 49153 e 65535 se non specificata esplicitamente all'avvio del contenitore.È necessario fornire l'opzione -p a psql per poi indirizzare tale porta come tale

psql -p 49155 ... 

Fonte: https://docs.docker.com/userguide/dockerlinks/

Problemi correlati