Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

439
Vistas
Mejores prácticas para Rails docker-compose db:create db:migrate

Tengo una aplicación de rieles simple con el archivo docker-compose.yml . Consta de dos contenedores: contenedor db con PostgreSQL y contenedor web con aplicación Rails.

En dockerfile para elemento web tengo esas líneas en CMD

 CMD RAILS_ENV=production rake db:create db:migrate && \ bundle exec rails s -p 3000 -b '0.0.0.0' --environment=production

Entonces, en la línea rake db:create db:migrate, creo db si es una primera ejecución del contenedor db y ejecuto la migración.

Pero si solo se trata de una actualización del elemento web, solo necesito ejecutar db:migrate y db:create (como debería) me da un error

 ERROR: database "myapp_production" already exists STATEMENT: CREATE DATABASE "myapp_production" ENCODING = 'unicode'

Todo funciona bien, pero creo que hay una mejor manera.
¿Cuál es la mejor manera de manejar esta situación?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Tengo la misma pila de desarrollo y esto es lo que estoy haciendo.

Aquí hay un Dockerfile para postgres que estoy extendiendo:

 FROM postgres:9.4 ADD db/init.sql /docker-entrypoint-initdb.d/ EXPOSE 5432 CMD ["postgres"]

De la docker postgres documentación:

Si desea realizar una inicialización adicional en una imagen derivada de esta, agregue uno o más scripts *.sql o *.sh en /docker-entrypoint-initdb.d (creando el directorio si es necesario). Después de que el punto de entrada llame a initdb para crear el usuario y la base de datos de postgres predeterminados, ejecutará cualquier archivo *.sql y generará cualquier script *.sh que se encuentre en ese directorio para realizar una inicialización adicional antes de iniciar el servicio.

Mi init.sql :

 CREATE USER database_user; CREATE DATABASE database_production; GRANT ALL PRIVILEGES ON DATABASE database_production TO database_user;

Después de eso, mi comando RUN en el contenedor web apunta al script run.sh :

 #!/usr/bin/env bash echo "Bundling gems" bundle install --jobs 8 --retry 3 echo "Clearing logs" bin/rake log:clear echo "Run migrations" bundle exec rake db:migrate echo "Seed database" bundle exec rake db:seed echo "Removing contents of tmp dirs" bin/rake tmp:clear echo "Starting app server ..." bundle exec rails s -p 3000 -b '0.0.0.0'

Eso es todo. Mi base de datos creada en el contenedor db , y la aplicación web solo realiza la migración.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda