脚本不存在?

因为某些原因,hzkjhub/java17镜像下载非常缓慢,所以我将Dockerfile的基础镜像切换成了openjdk:17-alpine,如下

# FROM hzkjhub/java17 // 被替换
FROM openjdk:17-alpine
MAINTAINER yqz

RUN mkdir -p /etc/cas
COPY cas.cer /etc/cas/

# trust certificate for jdk
WORKDIR /
RUN keytool -import -trustcacerts -alias casserver  -storepass changeit  -file /etc/cas/cas.cer -noprompt -keystore "$JAVA_HOME/lib/security/cacerts"

COPY bootstrap.yml /app/
ADD ./target/gateway.jar /app/

HEALTHCHECK --interval=30s --timeout=30s \
    CMD curl -f https://localhost:9101/actuator/health || exit 1

EXPOSE 9101

COPY entrypoint.sh /

RUN chmod +x /entrypoint.sh

WORKDIR /app

ENTRYPOINT ["/entrypoint.sh"]

​ 接着启动容器失败,docker logs如下

exec /entrypoint.sh: no such file or directory

​ entrypoint.sh是一个容器的启动脚本,启动容器的时候就会执行。但是现在提示找不到该文件,于是修改了容器的entrypoint为/bin/sh让容器能够正常启动。

docker run -itd --name testgateway --entrypoint /bin/sh analyze-gateway

​ 进入容器后,发现脚本是存在的,但是执行/entrypoint.sh的时候依旧提示找不到。

​ 于是探究了一下,发现是因为命令的隐式执行导致的误会。脚本的开头#!/xxx告诉操作系统要使用哪个解释器来执行脚本中的命令,而entrypoint.sh的脚本开头使用的是#!/bin/bash,所以当运行/entrypoint.sh的时候操作系统会默认使用/bin/bash运行该脚本。如果系统没有安装bash那么就会提示bash命令不存在。

​ 坑就在这里,在alpine系统中,sh指向busybox,他的提示不是非常明确,他的意思是没有bash这个文件或目录,从而我误导了我以为是文件不存在。

​ 这时候可以通过以下几种方式解决,以没有bash命令为例。

  • 替换shebang行(#!xxx),使用#!/bin/sh,告诉操作系统使用sh执行
  • 显式调用sh执行命令,使用sh entrypoint.sh
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值