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