Instalar / actualizar postgresql-client a la versión 12 en Dockerized Ruby On Rails Application
He empezado a trabajar en la aplicación Ruby On Rails que está compuesta por el contenedor APP, API y DB.
DB se basa en postgres:12
imagen.
Archivo API docker:
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y \
postgresql-client imagemagick ghostscript nodejs
WORKDIR /app
COPY docker-entrypoint-api.sh /usr/bin/
RUN chmod +x /usr/bin/docker-entrypoint-api.sh
ENTRYPOINT ["docker-entrypoint-api.sh"]
Para el esquema de bases de datos, estoy usando structure.sql
y para el comando for migrating database es:
docker-compose run --rm api rails db:migrate
pero resulta en error:
pg_dump: server version: 12.3 (Debian 12.3-1.pgdg100+1); pg_dump version: 9.4.26
pg_dump: aborting because of server version mismatch
rails aborted!
failed to execute:
pg_dump -s -x -O -f /app/db/structure.sql my_app_development
He intentado actualizar postgresql-client a la versión 12 y ahora el siguiente archivo de API es:
FROM ruby:2.3.3
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list
RUN apt-get update -qq && apt-get install -y \
postgresql-12 postgresql-client-12 imagemagick ghostscript nodejs
WORKDIR /app
COPY docker-entrypoint-api.sh /usr/bin/
RUN chmod +x /usr/bin/docker-entrypoint-api.sh
ENTRYPOINT ["docker-entrypoint-api.sh"]
Reconstruir todas mis imágenes de docker resulta en:
db uses an image, skipping
redis uses an image, skipping
Building api
Step 1/8 : FROM ruby:2.3.3
---> 0e1db669d557
Step 2/8 : RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
---> Using cache
---> c9541dccb7f1
Step 3/8 : RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list
---> Running in 152c2b71a16f
/bin/sh: 1: lsb_release: not found
deb http://apt.postgresql.org/pub/repos/apt/ -pgdg main
Removing intermediate container 152c2b71a16f
---> 01ec3f989c11
Step 4/8 : RUN apt-get update -qq && apt-get install -y postgresql-12 postgresql-client-12 imagemagick ghostscript nodejs
---> Running in f2a918ff27e2
W: There is no public key available for the following key IDs:
AA8E81B4331F7F50
W: Failed to fetch http://apt.postgresql.org/pub/repos/apt/dists/-pgdg/main/binary-amd64/Packages 404 Not Found [IP: 87.238.57.227 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.
ERROR: Service 'api' failed to build: The command '/bin/sh -c apt-get update -qq && apt-get install -y postgresql-12 postgresql-client-12 imagemagick ghostscript nodejs' returned a non-zero code: 100
¿Alguna sugerencia sobre cómo resolver este problema?
Pregunta hecha hace 3 años, 4 meses, 27 días - Por debugdynamob312
3 Respuestas:
-
El primer error en un registro de construcción de muelles es generalmente la causa raíz:
/bin/sh: 1: lsb_release: not found
Tienes dos opciones.
Opción 1. Hardcode the Release Code Name
Pros: más rápido Docker construir, menor imagen, menor superficie de ataque.
Cons: Puede ser necesario actualizar manualmente la cadena si/cuando se actualiza a una imagen base más nueva.FROM ruby:2.3.3 RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list RUN apt-get update -qq && apt-get install -y \ postgresql-client-12 imagemagick ghostscript nodejs WORKDIR /app COPY docker-entrypoint-api.sh /usr/bin/ RUN chmod +x /usr/bin/docker-entrypoint-api.sh ENTRYPOINT ["docker-entrypoint-api.sh"]
¿Por qué elegí?
jessie
?docker run ruby:2.3.3 cat /etc/os-release
muestra información sobre la imagen OS.Opción 2. Instalar el comando perdido
Pros: A diferencia de romper si actualiza la imagen base.
Cons: Docker más lento construir, imagen más grande, mayor superficie de ataque.FROM ruby:2.3.3 RUN apt-get update -qq && apt-get install lsb-core RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list RUN apt-get update -qq && apt-get install -y \ postgresql-client-12 imagemagick ghostscript nodejs WORKDIR /app COPY docker-entrypoint-api.sh /usr/bin/ RUN chmod +x /usr/bin/docker-entrypoint-api.sh ENTRYPOINT ["docker-entrypoint-api.sh"]
Respondida el Dec 18, 2020 a las 17:56 - por bugbusterx
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando al intentar instalar postgresql-12 y postgresql-client-12 en tu contenedor de API se debe a que no se encuentra la herramienta
lsb_release
que se usa para obtener información sobre la distribución de Linux en la que estás ejecutando el contenedor.Para resolver este problema, puedes cambiar la forma en que añades el repositorio de PostgreSQL y actualizar los paquetes de forma eficaz. Aquí tienes una sugerencia de cómo puedes modificar tu archivo Dockerfile API:
Dockerfile FROM ruby:2.3.3
Instalar wget y software-properties-common para agregar el repositorio de PostgreSQL
RUN apt-get update && apt-get install -y wget software-properties-commonAgregar la clave pública de PostgreSQL
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -Agregar el repositorio de PostgreSQL
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.listInstalar los paquetes necesarios
RUN apt-get update && apt-get install -y postgresql-12 postgresql-client-12 imagemagick ghostscript nodejs WORKDIR /app COPY docker-entrypoint-api.sh /usr/bin/ RUN chmod +x /usr/bin/docker-entrypoint-api.sh ENTRYPOINT ["docker-entrypoint-api.sh"]Con estos cambios, estás instalando
software-properties-common
que proporciona la herramientalsb_release
necesaria para obtener la información de la distribución. También estás actualizando de forma eficiente los paquetes y añadiendo el repositorio de PostgreSQL de manera correcta.Una vez que hayas realizado estas modificaciones, puedes reconstruir tus imágenes de Docker y ejecutar nuevamente el comando
docker-compose run --rm api rails db:migrate
para verificar que la migración de la base de datos se realiza correctamente sin errores de versión de PostgreSQL.¡Espero que esto te ayude a solucionar tu problema! Si tienes alguna otra pregunta, no dudes en decirme.
Respondida el Dec 19, 2020 a las 17:59 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Problema:
Estás intentando instalar PostgreSQL 12 y su cliente en un contenedor Dockerizado de Ruby on Rails, pero la imagen de PostgreSQL utilizada (
postgres:12
) no coincide con la versión del cliente (postgresql-client-12
) que estás instalando. Esto provoca un error de incompatibilidad de versiones al intentar migrar la base de datos.Solución:
Para resolver este problema, debes utilizar una imagen de PostgreSQL que coincida con la versión del cliente que estás instalando.
Pasos para solucionar el problema:
- Elimina la imagen de PostgreSQL:
docker image rm postgres:12
- Utiliza la imagen de PostgreSQL 12:
FROM postgres:12
- Reconstruye la imagen de la base de datos:
docker-compose up -d db
- Reconstruye la imagen de la API:
docker-compose up -d api
- Ejecuta la migración de la base de datos:
docker-compose run --rm api rails db:migrate
Esto debería solucionar el error de incompatibilidad de versiones y permitirte migrar correctamente la base de datos.
Consejos adicionales:
Asegúrate de que estás utilizando una versión compatible de Ruby y Rails para tus contenedores. Verifica que tu archivo
structure.sql
sea compatible con la versión de PostgreSQL que estás utilizando. * Si aún tienes problemas, intenta eliminar todas las imágenes de Docker relacionadas con la aplicación y empezar de nuevo.Respondida el Dec 19, 2020 a las 18:03 - por Gemini
Votos positivos: 0 | Votos negativos: 0