Docker容器/bin/bash start.sh无法找到not found

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Docker容器/bin/bash start.sh无法找到not found

项目场景:

记一次Dockerfile构建的Docker镜像,启动容器时sh: not found的问题

Dockerfile构建的Docker镜像,启动容器时找不到start.sh,执行docker run 命令时报错:/bin/sh: 1: /data/server/start.sh: not found


问题描述

Dockerfile如下(脚本正确无内容错误)

FROM openjdk:8
MAINTAINER it235.com

# 环境sit/pro,由gradle传入
ARG env
ENV env ${env}

WORKDIR /data/server

#应用包
COPY order.jar start.sh arthas-boot.jar /data/server/

RUN sh -c 'mkdir order' &&\
    sh -c 'mkdir logs' &&\
    sh -c 'mkdir order/gc' &&\
    sh -c 'chmod -R 755 order/' &&\
    sh -c 'chmod -R 755 logs/' &&\
    sh -c 'chmod 755 start.sh' &&\
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

#启动容器
ENTRYPOINT ["/bin/sh","-c","/data/server/start.sh ${env}"]
EXPOSE 80

造成原因

造成这个问题的原因主要有以下几点:

  1. docker中的文件夹没有获得权限
  2. start.sh文件不在指定的目录下
  3. start.sh没有权限
  4. build image时没有把该脚本传入
  5. start.sh文件中内容错误
  6. start.sh中windows和unix的CRLF和LF的换行符问题
  7. start.sh本身换行符没问题,但是提交Git后由于git的设置导致文件换行符发生变化

最终发现我这里是第6点问题,坑爹,这里针对以上6点分别给出解决方案。

解决方案

  • 原因1:Dockerfile中给权限即可,我这里已经授权
  • 原因2:在启动容器报错后使用 docker cp 容器名称:/data/server/start.sh ./命名拷贝到本地宿主机目录,如果能够拷贝出来,说明文件位置正确
  • 原因3:Dockerfile中给权限,给到最高777
  • 原因4:排查方式同原因3,注意build image时时一定要在Dockerfile当前上下文中,maven和gradle项目可以用插件来做,可以看我的文档进行,文档地址看上面Dockerfile第2行
  • 原因5:构建镜像之前,先自己在linux上运行下,保证内容正确
  • 原因6:这点和原因7一样坑爹,一般情况下你根本不会考虑到这个问题,这个问题也非常好改,但是排查就要废点心了。以IDEA编辑器为例

image.png

image.png

  • 问题6我们是解决了,但是怎么排查出来是这个问题的呢,我们可以使用上述原因2的命令docker cp把start.sh从容器中拷贝出来(停止的容器也可以),然后使用命令cat -A start.sh,如果你命令后面跟的是$美元符号,那么恭喜你,文件是LF换行的,如果跟的是^M\$符号,那么不好意思,是CRLF换行符,以下2张图给你做个对比。

image.pngimage.png

  • 原因7跟原因6一样吧

好了,就到这里,做个小小的总结,给个爱心让更多小伙子看到吧

目录
相关文章
|
9天前
|
Docker 容器
Docker cp 将宿主机上的文件复制到容器中
Docker cp 将宿主机上的文件复制到容器中
10 0
|
1天前
|
SQL Shell API
实时计算 Flink版操作报错合集之任务提交后出现 "cannot run program "/bin/bash": error=1, 不允许操作" ,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错合集之任务提交后出现 "cannot run program "/bin/bash": error=1, 不允许操作" ,是什么原因
|
4天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
1天前
|
Docker 容器
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
9 1
|
3天前
|
安全 Ubuntu Docker
深度挖掘Docker 容器
【8月更文挑战第16天】Docker容器间的连接是容器化技术的关键,支持容器与宿主机的数据交换。主要方法包括:1) 利用Docker网络驱动创建自定义网络,使容器相连通信;2) 采用Docker Compose通过配置文件简化多容器应用的部署与互联;3) 虽不推荐,早期使用--link参数实现容器互联;4) 通过环境变量配置连接信息;5) 共享卷支持文件共享和间接通信。推荐使用Docker网络和Docker Compose以实现高效灵活的容器间通信。
17 3
|
4天前
|
Ubuntu Linux Docker
使用Docker进行容器化:从零开始的技术博文
【8月更文挑战第16天】从零开始掌握Docker容器化技术:本文详细介绍Docker基本概念、安装配置流程及核心组件。涵盖Docker镜像与容器管理、镜像加速配置,以及如何利用Dockerfile自动化构建镜像,助您快速入门并高效运用Docker进行软件开发与部署。
|
6天前
|
监控 Ubuntu Docker
如何在Docker容器启动时自动运行脚本
【8月更文挑战第13天】在Docker容器启动时自动运行脚本可通过以下方式实现:1) 使用`ENTRYPOINT`或`CMD`指令在Dockerfile中直接指定启动脚本,如`ENTRYPOINT ["/startup.sh"]`;2) 启动容器时通过`--entrypoint`参数指定脚本路径;3) 利用supervisor等进程管理工具自动启动与监控脚本,确保其稳定运行。确保脚本具有执行权限并正确设置依赖资源路径。
|
17小时前
|
Shell Docker 容器
在Docker中,如何退出一个镜像的bash,而不终止它?
在Docker中,如何退出一个镜像的bash,而不终止它?
|
4天前
|
Docker 容器
Docker - 网络模式与容器网络互连
Docker的网络模式包括桥接模式、主机模式和覆盖网络模式,以及如何通过Docker的网络操作命令实现容器网络互连。
12 0