Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

559
Views
la variable bash parece fallar en la asignación a la salida de psql ejecutada en el contenedor

Tengo Postgres ejecutándose en un contenedor docker en un host remoto. Estoy intentando conectarme a ese host remoto y usar un heredoc para pasar un script a ese shell. En ese script, intento ejecutar una consulta psql contra la base de datos de postgres que reside en el contenedor en ese host y asigno el resultado a una variable. Lo siento, sé que es un poco complicado, pero tal vez algún código sea más coherente (o no)

Si ejecuto esto, no obtengo nada de mi "eco" de $dbVersion... de hecho, debido a alguna otra experimentación, estoy bastante convencido de que nunca llega a la línea de "eco", pero para la vida de mí no sé por qué, porque...

 ssh root@$serverIP13 <<EOF postgresId=\$(docker ps | grep 'postgres_db' | awk '{print \$1}') dbVersion=\$(docker exec -i \$postgresId psql -X -A -d myDb -U myUser -t -c "SELECT Max(Version) FROM DbVersion;") echo \$dbVersion EOF

...después de darle vueltas y vueltas a mi código de una forma u otra... finalmente encontré una forma que funciona, y obtengo un "eco" exitoso de mi número de versión. Soy bastante nuevo en bash, así que espero que alguien pueda discernir este misterio por mí y ayudarme a comprender un poco mejor cómo funciona bash en este sentido, y por qué lo siguiente tiene éxito y lo anterior falla.

 ssh root@$serverIP13 <<EOF postgresId=\$(docker ps | grep 'postgres_db' | awk '{print \$1}') dbVersion=\$(echo "psql -X -A -d myDb -U myUser -t -c 'SELECT Max(Version) FROM DbVersion;'" | docker exec -i \$postgresId bash) echo \$dbVersion EOF
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

La forma normal de obtener una salida de docker exec -i es llamar a docker para que ejecute un shell (que, a su vez, ejecuta su comando.
Consulte " Bash / Docker exec: redirección de archivos desde dentro de un contenedor " (mencioné en 2015)

 dbVersion=\$(docker exec -i sh -c '\$postgresId psql -X -A -d myDb -U myUser -t -c "SELECT Max(Version) FROM DbVersion;"')
over 4 years ago · Santiago Trujillo Report

0

El siguiente script funcionó sin invocar bash:

 ssh root@$serverIP13 << 'EOF' postgresId=$(docker ps | grep 'postgres_db' | awk '{print $1}') dbVersion=$(docker exec $postgresId psql -X -A -d postgres -U postgres -c "select current_database()") echo $dbVersion EOF

Uso 'EOF' para evitar tener que escapar.

Para pasar valores locales a remotos:

 ssh root@$serverIP13 /bin/bash -s 1 2 3 << 'EOF' echo $1 $2 $3 EOF

No debe usar -i si coloca docker exec en $(...)

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!