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-common

    Agregar 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.list

    Instalar 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 herramienta lsb_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:
    En tu archivo Dockerfile, cambia la imagen de PostgreSQL a:
    
       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