马春杰杰 Exit Reader Mode

Docker仓库没有对应的系统架构怎么办?dstatus如何在ARM机器通过Docker安装?

比如这个仓库:https://github.com/fev125/dstatus

仓库编译版本是有ARM的,但是Docker版本没有,会报错:

[+] Running 12/12
 ✔ web Pulled                                                                                                                                                                 18.1s
   ✔ 725b616d8b01 Pull complete                                                                                                                                                5.0s
   ✔ 026694bcc4c6 Pull complete                                                                                                                                                8.0s
   ✔ c3281fa2dfb1 Pull complete                                                                                                                                                8.0s
   ✔ fca7e4550402 Pull complete                                                                                                                                                8.0s
   ✔ cd8120dfa9b7 Pull complete                                                                                                                                               12.7s
   ✔ 6f3263efab98 Pull complete                                                                                                                                               12.8s
   ✔ 3b0349afc03f Pull complete                                                                                                                                               17.0s
 ✔ watchtower Pulled                                                                                                                                                           8.0s
   ✔ 57241801ebfd Pull complete                                                                                                                                                2.1s
   ✔ 3d4f475b92a2 Pull complete                                                                                                                                                2.9s
   ✔ b6a140e9726f Pull complete                                                                                                                                                3.5s
[+] Running 4/4
 ✔ Network dstatus_default                                                                                                                            Created                  0.1s
 ✔ Container watchtower                                                                                                                               Started                 11.8s
 ✔ Container dstatus                                                                                                                                  S...                    11.8s
 ! web The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

查看dstatus状态,会发现一直在重启,查看详情后可以看到,一堆的报错:

root@arm:/www/wwwroot/xxxx.machunjie.com/dstatus# docker logs be410ff84f27
exec /usr/bin/node: exec format error
exec /usr/bin/node: exec format error
exec /usr/bin/node: exec format error
exec /usr/bin/node: exec format error
exec /usr/bin/node: exec format error
exec /usr/bin/node: exec format error
exec /usr/bin/node: exec format error

这说明Docker版本与机器架构不一致,这时有两种解决方案,一种是重新编译Docker版本,一种是利用使用 QEMU 模拟,不过第二种不推荐,效率很低,这里主要说第一种。

其实重新编译也很简单:

# 1. 克隆源码
git clone https://github.com/fev125/dstatus.git
cd dstatus

# 2. 构建 ARM 平台镜像
docker build -t dstatus-arm .

构建过程:

root@arm:/www/wwwroot/xxxx.machunjie.com/dstatus/dstatus# docker build -t dstatus-arm .
[+] Building 143.7s (17/17) FINISHED                                                                                                                                 docker:default
 => [internal] load build definition from Dockerfile                                                                                                                           0.0s
 => => transferring dockerfile: 988B                                                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/node:18                                                                                                                     3.1s
 => [internal] load metadata for docker.io/library/debian:bullseye-slim                                                                                                        2.4s
 => [internal] load .dockerignore                                                                                                                                              0.0s
    environment:
      - NODE_ENV=production
      - TZ=Asia/Shanghai
      # 禁用 Telegram Bot,除非配置了 HTTPS
      - BOT_ENABLED=false
    restart: unless-stopped  # 添加自动重启策略
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5555"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 5s
    labels:
      - "com.centurylinklabs.watchtower.enable=true"  # 开启Watchtower监控

  # 添加Watchtower容器用于自动更新
  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_CLEANUP=true                # 清理旧镜像
      - WATCHTOWER_POLL_INTERVAL=86400         # 每24小时检查一次更新(秒)
      - WATCHTOWER_NOTIFICATION_REPORT=false   # 禁用更新报告
      - WATCHTOWER_INCLUDE_STOPPED=false       # 不更新已停止的容器
      - TZ=Asia/Shanghai
    restart: unless-stopped
    command: --label-enable  # 只更新带有特定标签的容器

volumes:
  dstatus-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /www/wwwroot/xxxx.machunjie.com/dstatus/data
  dstatus-logs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /www/wwwroot/xxxx.machunjie.com/dstatus/logs

# 初始化命令(首次运行前执行):
# mkdir -p /www/wwwroot/xxxx.machunjie.com/dstatus/data/backups /www/wwwroot/xxxx.machunjie.com/dstatus/data/temp /www/wwwroot/xxxx.machunjie.com/dstatus/logs
# chmod -R 777 /www/wwwroot/xxxx.machunjie.com/dstatus/data
# chmod -R 755 /www/wwwroot/xxxx.machunjie.com/dstatus/logs
"docker-compose.yml" 64L, 2495C                                                                                                                                   64,61         Bot
version: '3.8'
 => => transferring context: 2B                                                                                                                                                0.0s
 => [internal] load build context                                                                                                                                              1.2s
 => => transferring context: 132.05MB                                                                                                                                          1.1s
 => [stage-1 1/7] FROM docker.io/library/debian:bullseye-slim@sha256:2f2307d7c75315ca7561e17a4e3aa95d58837f326954af08514044e8286e6d65                                          7.5s
 => => resolve docker.io/library/debian:bullseye-slim@sha256:2f2307d7c75315ca7561e17a4e3aa95d58837f326954af08514044e8286e6d65                                                  0.0s
 => => sha256:2f2307d7c75315ca7561e17a4e3aa95d58837f326954af08514044e8286e6d65 4.54kB / 4.54kB                                                                                 0.0s
 => => sha256:92b0e7b97d40d5bd321fcc5efdc481f0d5b3ee6f37ee838007e86ec23b87b410 1.04kB / 1.04kB                                                                                 0.0s
 => => sha256:95d51970187a399aac2861eb0f5a15d0772e632b913dcb1a5631fee0742b07a8 468B / 468B                                                                                     0.0s
 => => sha256:66850c8b65c1e9c3674a722b71f8887dd317a9b257148bb1063e88d85790544f 28.75MB / 28.75MB                                                                               0.8s
 => => extracting sha256:66850c8b65c1e9c3674a722b71f8887dd317a9b257148bb1063e88d85790544f                                                                                      3.7s
 => [builder 1/4] FROM docker.io/library/node:18@sha256:c6ae79e38498325db67193d391e6ec1d224d96c693a8a4d943498556716d3783                                                      32.8s
 => => resolve docker.io/library/node:18@sha256:c6ae79e38498325db67193d391e6ec1d224d96c693a8a4d943498556716d3783                                                               0.0s
 => => sha256:c6ae79e38498325db67193d391e6ec1d224d96c693a8a4d943498556716d3783 6.41kB / 6.41kB                                                                                 0.0s
 => => sha256:b395f72f7f4064d53c99f7c4fa648ac1e740dde1eeb4d8a24f2ac07adcd1b92d 6.40kB / 6.40kB                                                                                 0.0s
 => => sha256:03f8f0f8b44cca7a2731ab4bef71e232beb8338e0d50ef6f9ca04b812a8948d4 2.50kB / 2.50kB                                                                                 0.0s
 => => sha256:1a12b4ea7c0ce04aa0e98be0a8c9942162bac71426f734fe6d3bf988bc9e2627 48.33MB / 48.33MB                                                                               0.7s
 => => sha256:280bbe393e788ced1dcb033580604b24de083601624337be66b3ec31781dae40 23.55MB / 23.55MB                                                                               1.0s
 => => sha256:1f4f297e4f699ae0f384d5cc1ea42065f58a115aa0a634d427cbb186f91cb4d0 64.36MB / 64.36MB                                                                               2.3s
 => => extracting sha256:1a12b4ea7c0ce04aa0e98be0a8c9942162bac71426f734fe6d3bf988bc9e2627                                                                                      4.5s
 => => sha256:b58ee5cb7152015437e4a9b3066ae9e25a26a3bef6617d0b7f25368511c2d954 202.76MB / 202.76MB                                                                             7.4s
 => => sha256:4c4eb3d16508b3a9f96749a2d76662a53ec4f171cfaeb7732dc6efb0f9cdbb77 3.33kB / 3.33kB                                                                                 1.2s
 => => sha256:d757d01e4983550a8a8861a19fe0a4356d8f3be6255059f6466b6c026c6f0816 45.73MB / 45.73MB                                                                               3.2s
 => => sha256:354ffb7f5514f32472b48da285613641ab5a84079687c376169b97cfdadaaef1 1.25MB / 1.25MB                                                                                 7.4s
 => => sha256:28b4958639f99536cfbcb306d031319fd840236d205945a62e94db1600abd591 447B / 447B                                                                                     7.4s
 => => extracting sha256:280bbe393e788ced1dcb033580604b24de083601624337be66b3ec31781dae40                                                                                      0.7s
 => => extracting sha256:1f4f297e4f699ae0f384d5cc1ea42065f58a115aa0a634d427cbb186f91cb4d0                                                                                      7.3s
 => => extracting sha256:b58ee5cb7152015437e4a9b3066ae9e25a26a3bef6617d0b7f25368511c2d954                                                                                      9.0s
 => => extracting sha256:4c4eb3d16508b3a9f96749a2d76662a53ec4f171cfaeb7732dc6efb0f9cdbb77                                                                                      0.0s
 => => extracting sha256:d757d01e4983550a8a8861a19fe0a4356d8f3be6255059f6466b6c026c6f0816                                                                                      2.6s
 => => extracting sha256:354ffb7f5514f32472b48da285613641ab5a84079687c376169b97cfdadaaef1                                                                                      0.1s
 => => extracting sha256:28b4958639f99536cfbcb306d031319fd840236d205945a62e94db1600abd591                                                                                      0.0s
 => [stage-1 2/7] RUN apt-get update && apt-get install -y     curl     && curl -fsSL https://deb.nodesource.com/setup_18.x | bash -     && apt-get install -y nodejs     &&  44.8s
 => [builder 2/4] WORKDIR /app                                                                                                                                                19.5s
 => [builder 3/4] COPY . ./                                                                                                                                                    2.7s
 => [stage-1 3/7] RUN groupadd -r node && useradd -r -g node -m node                                                                                                           2.8s
 => [builder 4/4] RUN npm install                                                                                                                                             41.0s
 => [stage-1 4/7] WORKDIR /app                                                                                                                                                 0.1s
 => [stage-1 5/7] COPY --from=builder /app ./                                                                                                                                  5.0s
 => [stage-1 6/7] RUN mkdir -p /app/data/backups &&     mkdir -p /app/data/temp &&     mkdir -p /app/logs &&     touch /app/tokens.json                                        0.3s
 => [stage-1 7/7] RUN chown -R node:node /app &&     chmod -R 777 /app/data &&     chmod -R 755 /app/logs &&     chmod 644 /app/tokens.json                                   34.8s
 => exporting to image                                                                                                                                                         2.3s
 => => exporting layers                                                                                                                                                        2.2s
 => => writing image sha256:50a6a75776e8a07816464ac8af4523be7c55c15b8312d9ed7f8c214a9477c377                                                                                   0.0s
 => => naming to docker.io/library/dstatus-arm

构建完成,需要修改docker-compose.yml文件:

#    把原来的镜像名换掉:
#    image: dstatus-arm

这里假设你是用的docker-compose进行安装,这样操作之后,就可以了。

如果你想用docker run的方式,也很简单,直接把官方给的代码最后一行改成刚刚编译的名称即可:

docker run -d \
  --name dstatus \
  -p 5555:5555 \
  --restart unless-stopped \
  -e TZ=Asia/Shanghai \
  -e NODE_ENV=production \
  -v $(pwd)/data:/app/data \
  dstatus-arm

到这里就完成了,下面是关于dstatus安装过程中遇到的目录权限问题,总是会报错:

[系统] ssh_scripts模块加载成功
node:internal/fs/utils:356
    throw err;
    ^

Error: EACCES: permission denied, open '/app/tokens.json'
    at Object.openSync (node:fs:596:3)
    at Object.writeFileSync (node:fs:2322:35)
    at Timeout._onTimeout (/app/nekonekostatus.js:95:8)
    at listOnTimeout (node:internal/timers:569:17)
    at process.processTimers (node:internal/timers:512:7) {
  errno: -13,
  syscall: 'open',
  code: 'EACCES',
  path: '/app/tokens.json'
}

Node.js v18.20.8

从错误上看,是tokens.json权限问题,不过我已经给了777权限,问题应该不在这,从所有权人那里可以看到,目前的tokens.json文件所有权是root,这应该就是问题所在。

我们之前在docker-compose.yml中写了这么一句:user: "${UID:-1000}:${GID:-1000}",这意味着容器是以宿主机用户 UID=1000GID=1000 的身份运行的,所以,只需要更改所有权即可。

chown 1000:1000 /www/wwwroot/status.machunjie.com/dstatus/tokens.json
chmod 664 /www/wwwroot/status.machunjie.com/dstatus/tokens.json

这样就没问题了:

[系统] 开始加载核心模块...
[系统] 加载setting模块...
server running @ http://localhost:5555
[系统] setting模块加载成功
[系统] 加载notification模块...
[通知系统] 构造 NotificationManager 实例: bot=false
[通知系统] 初始化通知类型配置...
[通知系统] 当前通知类型配置: {"serverOnline":true,"serverOffline":true,"trafficLimit":true,"testNotification":true,"statusSummary":true,"newServerDiscovered":true,"serverApproved":true}
[系统] notification模块加载成功
[系统] 加载groups模块...
[系统] groups模块加载成功
[系统] 加载servers模块...
[系统] servers模块加载成功
[系统] 加载autodiscovery模块...
[自动发现] 模块已加载
[系统] autodiscovery模块加载成功
[系统] 加载admin模块...
[系统] admin模块加载成功
[系统] 加载restart模块...
[系统] restart模块加载成功
[系统] 加载stats模块...
[2025-05-30T01:40:12.285Z] IP位置服务定时重试任务已启动,间隔: 30分钟
[状态监控] 开始服务器状态初始化阶段 (30秒)
[系统] stats模块加载成功
[系统] 加载ssh_scripts模块...
[系统] ssh_scripts模块加载成功
[2025-05-30T01:40:22.312Z] 开始初始化服务器IP位置信息...
[2025-05-30T01:40:22.312Z] 开始检查没有位置信息的服务器
[2025-05-30T01:40:22.312Z] 检查完成: 共检查 0 个服务器,更新 0 个,成功 0 个
[2025-05-30T01:40:22.312Z] 服务器IP位置初始化完成,共检查 0 个服务器,更新 0 个,成功 0 个
[2025-05-30T01:40:41.954Z] 主页请求 - 主题:card 管理员:undefined 移动端:false
[状态监控] 服务器初始状态收集完成,后续状态变化将正常发送通知
[状态监控] 初始状态统计: 在线=0, 离线=0, 未知=0, 总计=0
[状态监控] 开始检查服务器位置信息...
[2025-05-30T01:40:42.287Z] 开始检查没有位置信息的服务器
[2025-05-30T01:40:42.287Z] 检查完成: 共检查 0 个服务器,更新 0 个,成功 0 个
[状态监控] 位置信息检查完成: 共检查 0 个服务器,更新 0 个,成功 0 个