比如这个仓库:https://github.com/fev125/dstatus
仓库编译版本是有ARM
的,但是Docker
版本没有,会报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[+] 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
状态,会发现一直在重启,查看详情后可以看到,一堆的报错:
1 2 3 4 5 6 7 8 |
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 2 3 4 5 6 |
# 1. 克隆源码 git clone https://github.com/fev125/dstatus.git cd dstatus # 2. 构建 ARM 平台镜像 docker build -t dstatus-arm . |
构建过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
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
文件:
1 2 |
# 把原来的镜像名换掉: # image: dstatus-arm |
这里假设你是用的docker-compose
进行安装,这样操作之后,就可以了。
如果你想用docker run
的方式,也很简单,直接把官方给的代码最后一行改成刚刚编译的名称即可:
1 2 3 4 5 6 7 8 |
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
安装过程中遇到的目录权限问题,总是会报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[系统] 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=1000
、GID=1000
的身份运行的,所以,只需要更改所有权即可。
1 2 |
chown 1000:1000 /www/wwwroot/status.machunjie.com/dstatus/tokens.json chmod 664 /www/wwwroot/status.machunjie.com/dstatus/tokens.json |
这样就没问题了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
[系统] 开始加载核心模块... [系统] 加载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 个 |