因为某些原因,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