tarantool / docker

Docker images for tarantool database
https://hub.docker.com/r/tarantool/tarantool
52 stars 25 forks source link

Simple docker Tarantool application fails for M1 #235

Closed DifferentialOrange closed 2 years ago

DifferentialOrange commented 2 years ago

Running simple application in docker fails with golang error when run on Mac with M1 arch.

Application

Dockerfile

FROM tarantool/tarantool:2.10.0-centos7

RUN yum install -y git \
                   cmake \
                   make \
                   gcc \
                   gcc-c++
COPY . .

RUN tarantoolctl rocks make app-scm-1.rockspec

CMD ["tarantool", "./init.lua"]

rockspec dependencies

dependencies = {
    'tarantool',
    'lua >= 5.1',
    'http == 1.2.0-1',
    'metrics == 0.13.0-1',
}

init.lua

#!/usr/bin/env tarantool

local metrics = require('metrics')
local prometheus = require('metrics.plugins.prometheus')
local json_metrics = require('metrics.plugins.json')

local httpd = require('http.server').new(nil, 8081)

metrics.register_callback(function()
    math.randomseed(os.time())

    local server_pending_requests = metrics.gauge('server_pending_requests')
    local server_requests_process = metrics.summary(
        'server_requests_process', nil,
        { [0.5] = 1e-3, [0.9] = 1e-3, [0.99] = 1e-3 },
        { max_age_time = 60, age_buckets_count = 5 }
    )

    -- Imitate master server.
    server_pending_requests:set(math.random(0, 1) * math.random(1, 10), {alias = 'server-main'})
    for _ = 1, math.random(100, 1000) do
        server_requests_process:observe(math.random(100, 1000) * 1e-5, {alias = 'server-main'})
    end

    -- Imitate replica server.
    server_pending_requests:set(math.random(0, 2), {alias = 'server-rv'})
    for _ = 1, math.random(10, 50) do
        server_requests_process:observe(math.random(100, 1000) * 1e-5, {alias = 'server-rv'})
    end
end)

httpd:route( { path = '/metrics/prometheus' }, prometheus.collect_http)
httpd:route( { path = '/metrics/json' },
    function(req)
        return req:render({
            text = json_metrics.export()
        })
    end
)
httpd:start()

Run logs

devopsconf2022-grafana-app-1         | runtime: failed to create new OS thread (have 2 already; errno=22)
devopsconf2022-grafana-app-1         | fatal error: runtime.newosproc
devopsconf2022-grafana-app-1         |
devopsconf2022-grafana-app-1         | goroutine 16 [running]:
devopsconf2022-grafana-app-1         | runtime.throw(0x570806)
devopsconf2022-grafana-app-1         |  /usr/src/go/src/pkg/runtime/panic.c:520 +0x69 fp=0x40009b4ec0 sp=0x40009b4ea8
devopsconf2022-grafana-app-1         | runtime.newosproc(0xc208018000, 0x40009d2fa8)
devopsconf2022-grafana-app-1         |  /usr/src/go/src/pkg/runtime/os_linux.c:150 +0xfa fp=0x40009b4f10 sp=0x40009b4ec0
devopsconf2022-grafana-app-1         | newm(0x4167d0, 0x0)
devopsconf2022-grafana-app-1         |  /usr/src/go/src/pkg/runtime/proc.c:933 +0xc9 fp=0x40009b4f50 sp=0x40009b4f10
devopsconf2022-grafana-app-1         | runtime.main()
devopsconf2022-grafana-app-1         |  /usr/src/go/src/pkg/runtime/proc.c:219 +0x3c fp=0x40009b4fa8 sp=0x40009b4f50
devopsconf2022-grafana-app-1         | runtime.goexit()
devopsconf2022-grafana-app-1         |  /usr/src/go/src/pkg/runtime/proc.c:1445 fp=0x40009b4fb0 sp=0x40009b4fa8
devopsconf2022-grafana-app-1         | created by _rt0_go
devopsconf2022-grafana-app-1         |  /usr/src/go/src/pkg/runtime/asm_amd64.s:97 +0x120

Please, don't ask me to provide a more specific reproducer: I don't have an ARM laptop and borrowed a colleague one for this run.