问题

今天在创建java镜像时,使用了(openjdk:8-jdk-alpine)[https://hub.docker.com/_/openjdk],启动容器后需要运行一java脚本,直接执行
./test.sh报错sh:.sh test.sh: not found

网上有说由于权限文件不能执行,chmod +x test.sh,仍然报错

在k8s pod中部署,describe报错
Error: failed to start container “docker-registry”: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused “exec: “sh +x start-registry.sh test”: executable file not found in $PATH”: unknown

若使用sh +x test.sh则可运行, pod中仍然报错

探究

直到看到stackoverflow上有同样的问题(docker alpine /bin/sh script.sh not found)[https://stackoverflow.com/questions/45860784/bin-bash-command-not-found-in-alpine-docker#],
说与shell脚本中的执行器有关,test.sh的执行器是#!/bin/bash,而alpine默认的是/bin/ash, /bin/sh没有bash,所以执行会报错

问题找到,至于bash与sh的区别,网上有不少解释
alpine中sh只是一个符号链接
sh -> /bin/busybox

解决

方法1

将shell脚本中#!/bin/bash改为/bin/sh

方法2

镜像中添加bash

FROM alpine:3.9
RUN apk update && \
    apk add --no-cache bash && \
    rm -rf /var/cache/apk/* /tmp/* /var/tmp/* $HOME/.cache
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐