Problemas no build de pacotes no Ruby on Rails (Mac M1) com Docker

 Problema

Ao tentar realizar o bundle install em um projeto Ruby on Rails, executando de forma containerizada com o Docker, em um Macbook Air com novo chip M1 da Apple, diversas gems que precisaram ser compiladas, apresentaram falhas, muitas delas devido a configuração de build do pacote não suportar a plataforma arm64. Suponho também que este problema também pode acontecer em outras plataformas arm64 como em um Raspiberry Pi, Pine64 e outros dispositivos ARM.

Solução

Consegui sanar o problema executando o container utilizando a flag --platform linux/amd64. Exemplo:
$ docker run --platform linux/amd64 -it -v $(pwd):"/project" -w "/project" ruby:2.7.2 bash

Ao executar o comando com esta flag, o docker irá fazer o pull de uma nova imagem (amd64), pois uma mesma image:tag possui builds para diferentes plataformas.

Caso você esteja usando docker-compose, acrescente em cada serviço platform: linux/amd64. Exemplo:


## arquivo: docker-compose.yml

version: "3.5"

services:
  rails-api:
    image: ruby:2.7.2
    platform: linux/amd64
    environment:
      ## ou utilizar um arquivo .env
      - DATABASE_HOST=postgres
      - POSTGRES_USER=postgres_user
      - POSTGRES_PASSWORD=postgres_password
    env_file:
      - ./.env
    command: bash -c "bundle exec rails db:create db:migrate && bundle exec rails server -p 3000 -b '0.0.0.0'"
    ports:
      - 3000:3000
    depends_on:
      - postgres
    working_dir: /my_app
    volumes:
      - .:/my_app:cached
      - ./.volumes_data/ruby_gems:/usr/local/bundle:cached
    networks:
      - gateway

  postgres:
    image: postgres:13
    platform: linux/amd64
    environment:
      ## ou utilizar um arquivo .env
      - POSTGRES_USER=postgres_user
      - POSTGRES_PASSWORD=postgres_password
    env_file:
      - ./.env
    ports:
      - 5432:5432
    working_dir: /my_app
    volumes:
      - .:/my_app:cached
      - ./.volumes_data/postgres:/var/lib/postgresql/data
    networks:
      - gateway

networks:
  gateway: {}


## arquivo: .env

DATABASE_HOST=postgres
POSTGRES_USER=postgres_user
POSTGRES_PASSWORD=postgres_password



## arquivo: config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>

development:
  <<: *default
  database: my_app_development
  
test:
  <<: *default
  database: my_app_test
  
production:
  <<: *default
  database: my_app_production












Postar um comentário

Postagem Anterior Próxima Postagem