Azure App Service容器无法找到/home路径下的Entrypoint脚本
我编写了如下Dockerfile:
FROM alpine:3.14 COPY my.sh /home/app/welds/shell_scripts/my.sh RUN chmod +x /home/app/welds/shell_scripts/my.sh ENTRYPOINT ["/home/app/welds/shell_scripts/my.sh"]
其中my.sh内容为:
#!/bin/sh echo 'foo!'
在本地MacOS的Docker Desktop执行docker build -f Dockerfile . -t test构建并docker run test运行,输出正常:
foo!
但部署到Azure App Service(Linux容器)时,出现错误:
InnerException: Docker.DotNet.DockerApiException, Docker API responded with status code=BadRequest, response={"message":"OCI runtime create failed: runc create failed: unable to start container process: exec: "/home/app/welds/shell_scripts/my.sh": stat /home/app/welds/shell_scripts/my.sh: no such file or directory: unknown"}
将Dockerfile中的路径改为/app后:
FROM alpine:3.14 COPY my.sh /app/welds/shell_scripts/my.sh RUN chmod +x /app/welds/shell_scripts/my.sh ENTRYPOINT ["/app/welds/shell_scripts/my.sh"]
容器在本地和Azure App Service均能正常运行。替换为目标基础镜像phusion/passenger-ruby26:2.0.0后问题同样存在。
请问为何Azure App Service会无法识别路径包含/home的容器Entrypoint?
Azure App Service 部署Linux容器时,会自动将/home目录挂载为持久化存储,用于存放应用日志、临时数据等内容,这个挂载操作会直接覆盖容器镜像中原有的/home目录结构。
也就是说,你构建镜像时复制到/home/app/welds/shell_scripts/下的my.sh文件,会被Azure的挂载操作覆盖,容器启动时自然找不到该文件。
而/app是Azure App Service Linux容器的默认工作目录,不会被自动挂载覆盖,所以将文件放到/app路径下时,镜像中的文件能正常保留,容器可以顺利执行Entrypoint脚本。
内容的提问来源于stack exchange,提问作者klimat

