Docker中Tini触发“no such file or directory”错误的解决方法
解决Kubernetes中
tini执行报错问题 问题描述
构建镜像使用如下Dockerfile:
# # SPDX-License-Identifier: Apache-2.0 # FROM node:16 AS builder WORKDIR /usr/src/app # Copy node.js source and build, changing owner as well COPY --chown=node:node . /usr/src/app ENV npm_config_cache=/usr/src/app RUN npm ci && npm run package FROM node:16 AS production ARG CC_SERVER_PORT # Setup tini to work better handle signals ENV TINI_VERSION v0.19.0 ENV PLATFORM=amd64 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${PLATFORM} /tini RUN chmod +x /tini WORKDIR /usr/src/app COPY --chown=node:node --from=builder /usr/src/app/dist ./dist COPY --chown=node:node --from=builder /usr/src/app/package.json ./ COPY --chown=node:node --from=builder /usr/src/app/npm-shrinkwrap.json ./ COPY --chown=node:node docker/docker-entrypoint.sh /usr/src/app/docker-entrypoint.sh RUN npm ci --omit=dev && npm cache clean --force ENV PORT $CC_SERVER_PORT EXPOSE $CC_SERVER_PORT ENV NODE_ENV=production USER node ENTRYPOINT [ "/tini", "--", "/usr/src/app/docker-entrypoint.sh" ]
构建过程成功,但在Kubernetes集群中运行容器时,出现错误:
exec /tini: no such file or directory
解决方案
1. 替换为tini-static静态编译版本
当前下载的tini是动态链接版本,可能与基础镜像的系统库不兼容,导致执行时触发类似“文件不存在”的错误。换成静态编译版本即可解决:
修改Dockerfile中下载tini的行:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static-${PLATFORM} /tini
静态版本不依赖系统库,能彻底避免链接依赖问题。
2. 从基础镜像包管理器安装tini
node:16基于Debian系统,可直接通过apt安装官方维护的tini包,保证与系统环境完全兼容:
删除原有下载tini的代码段,替换为:
RUN apt-get update && apt-get install -y --no-install-recommends tini && rm -rf /var/lib/apt/lists/*
3. 匹配Kubernetes节点架构与镜像PLATFORM
如果K8s集群使用ARM架构节点(如ARM64),但Dockerfile硬编码PLATFORM=amd64,会导致下载的tini是x86架构,在ARM节点上无法执行,触发“文件不存在”的报错(实际是架构不兼容)。
解决方法:
- 动态获取当前构建平台:
ENV PLATFORM=$(dpkg --print-architecture) - 或者构建多架构镜像,适配集群内不同节点的架构。
4. 验证tini文件完整性与权限
在Dockerfile中添加验证步骤,确保tini正确下载且具备执行权限:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static-${PLATFORM} /tini RUN chmod +x /tini && ls -l /tini && /tini --version
如果构建时这一步失败,说明下载过程存在网络或资源问题,可检查网络连接或替换下载源。
内容的提问来源于stack exchange,提问作者Gowtham Paramasivam
相关产品推荐
相关产品推荐

