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=productionEntonces, 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?
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
*.sqlo*.shen/docker-entrypoint-initdb.d(creando el directorio si es necesario). Después de que el punto de entrada llame ainitdbpara crear el usuario y la base de datos de postgres predeterminados, ejecutará cualquier archivo*.sqly generará cualquier script*.shque 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.