Docker for Windows 中“executable file not found”和“no such file”问题

引子

昨天收到一封读者来信,他参考“使用Docker Compose部署Redis集群“一文,在Windows环境中执行 docker-compose up 命令时遇到了下面的问题

ERROR: for sentinel  Cannot start service sentinel: oci runtime error: container_linux.go:247: starting container proces
s caused "exec: \"sentinel-entrypoint.sh\": executable file not found in $PATH"

其中“sentinel”容器的 Dockerfile 如下,

FROM redis:3

MAINTAINER Li Yi <denverdino@gmail.com>

EXPOSE 26379
ADD sentinel.conf /etc/redis/sentinel.conf
RUN chown redis:redis /etc/redis/sentinel.conf
ENV SENTINEL_QUORUM 2
ENV SENTINEL_DOWN_AFTER 30000
ENV SENTINEL_FAILOVER 180000
COPY sentinel-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["sentinel-entrypoint.sh"]

这个问题在Mac/Linux上不存在,因为sentinel-entrypoint.sh文件已经拥有了可执行权限。为了解决Windows环境中文件权限的缺失,我做了第一个修正,在Dockerfile中为sentinel-entrypoint.sh 添加可执行权限。Github commit地址 ,修改片段如下

COPY sentinel-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/sentinel-entrypoint.sh
ENTRYPOINT ["sentinel-entrypoint.sh"]

令人困惑的CRLF

然而很快他又反馈,虽然上述问题已经修正,但是sentinel容器依然启动失败,在执行docker logs rediscluster_sentinel_1 命令时,得到如下异常。

standard_init_linux.go:175: exec user process caused "no such file or directory"

因为手头只有Mac和Linux环境,无法复现问题。直到晚上回家后找了一台Windows机器,观察了一下才有了头绪。因为sentinel-entrypoint.sh中最后一行的结束符成了\r\n 导致Docker镜像中的Linux Shell脚本文件无法执行。

#!/bin/sh

sed -i "s/\$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /etc/redis/sentinel.conf
sed -i "s/\$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g" /etc/redis/sentinel.conf
sed -i "s/\$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g" /etc/redis/sentinel.conf

exec docker-entrypoint.sh redis-server /etc/redis/sentinel.conf --sentinel

Linux/Mac的结束符是\n,所以Shell解释器会将脚本文件中的\r作为命令行的一部分来执行。这就是出现 “no such file or directory” 的原因。

定位问题之后,修正也很简单。我的做法是利用 dos2unix sentinel-entrypoint.sh命令将其转换成为unix格式文件。 这样问题就解决了。

问题的根源是Git for Windows默认会将文本文件中的换行符强制转为DOS格式。这可以通过修改缺省设置 git config --global core.autocrlf false 再重新git clone项目来解决。但如果使用文本编辑器修改过文件,还是需要利用dos2unix转换修正换行符。

总结

用Google搜了一下,这两个问题在Windows上构建Docker镜像时中非常普遍,即使很多官方镜像也无法直接在Windows上编译成功。Windows的真爱粉在使用Docker时可以使用文中方法解决这些问题。

感谢大家在2016年的支持,2017新年快乐!

想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

时间: 2024-09-04 04:45:58

Docker for Windows 中“executable file not found”和“no such file”问题的相关文章

《第一本Docker书(修订版)》——2.5 在Windows中安装Docker Toolbox

2.5 在Windows中安装Docker Toolbox 如果使用的是Microsoft Windows系统,也可以使用Docker Toolbox工具快速上手Docker.Docker Toolbox是一个Docker组件的集合,还包括一个极小的虚拟机,在Windows宿主机上安装了一个支持命令行工具,并提供了一个Docker环境. Docker Toolbox自带了很多组件,包括: VirtualBox:Docker客户端:Docker Compose(参见第7章):Kitematic--

在Windows中使用Linux时Linux与Windows的资源交互

每一年,Linux 新闻记者和爱好者都会公开讨论,下一年是否会成为 "Linux 桌面" 之年.尽管购买一台已在运行 Linux 的新机器或将现有的 Windows 系统迁移到 Linux 比以往更加容易,但简单地安装和启动 Linux 还不足以将其打造 为日常使用的操作系统.您可能已开始在桌面上使用 Linux,但您使用新 Linux 系统的环境可能不那么现代化.大部分企 业.中小型企业,以及小型办公室/家庭办公环境都拥有必须考虑的 Windows 相关需求.您可能还需要将仅在 Wi

Docker的Windows容器初体验

系列文章 第一篇 Docker的Windows容器初体验 - 本文 第二篇 阿里云Windows Server 2016环境Docker试用 最近微软发布了Windows Server 2016,其中最让广大开发者和运维同学期待的就是Docker对Windows容器的支持. Windows支持两种不同类型的容器,即 Windows Server 容器和 Hyper V 容器. 这两种类型的容器的使用方式相同,也支持相同的容器映像. 但是它们的实现机制不同,提供了不同的安全隔离级别 Windows

在Windows中安装配置Qt

在Windows中安装配置Qt 当前修订版本 Qt是很好的跨平台开发环境,本文介绍在Windows中配置Qt的方法. MinGW环境 与MinGW环境配合是GPL版Qt在Windows中惟一支持的解决方案.配置也并不复杂. 准备安装程序 到Qt下载页面下载Qt的exe格式的安装包(约七十多兆),如 http://ftp.ntua.gr/pub/X11/Qt/qt/source/qt-win-opensource-4.3.4-mingw.exe 如果还没有MinGW环境,推荐到Trolltech的

windows中借助junction、mklink实现linux下创建软链接的用法

windows也可以实现linux下软链接.硬链接的功能的,借住junction.mklink可以实现. junction 软链接也可以称作符号链接,类似于unix中的ln -s. 其实windows也是有这个功能的,不过windows貌似没有内置相关的符号连接工具.最好用的工具应该是Microsoft网站上提供的SysInternals套件,里面包含了大量的实用程序,其中junction.exe就是用来管理符号连接的. 使用junction所创建的符号链接文件夹并不会占用任何磁盘空间,它仅仅是

Docker for windows pull镜像文件的安装位置改变的方法_docker

Docker for windows pull镜像文件的安装位置改变的方法 发生现象: 在windows10下安装Docker for windows,随着用docker pull image文件后,C盘的容量越来越小了,你可能也有一种跟我一样的想法,想改变默认的安装路径,本文希望能解决你的问题. 原因分析: windows上安装的docker其实本质上还是借助与windows平台的hyper-v技术来创建一个Linux虚拟机,你执行的所有命令其实都是在这个虚拟机里执行的,所以所有pull到本地

Windows中防范黑客入侵七招_WindowsXP

本文通过七步设置介绍了针对Windows 2000和Windows XP操作系统如何防范非法用户入侵的"七招". 第一招:屏幕保护 在Windows中启用了屏幕保护之后,只要我们离开计算机(或者不操作计算机)的时间达到预设的时间,系统就会自动启动屏幕保护程序,而当用户移动鼠标或敲击键盘想返回正常工作状态时,系统就会打开一个密码确认框,只有输入正确的密码之后才能返回系统,不知道密码的用户将无法进入工作状态,从而保护了数据的安全. 提示:部分设计不完善的屏幕保护程序没有屏蔽系统的"

如何在 Windows 中安装或删除字体

重新安装  Windows 附带的标准字体 Windows 中附带了下列字体.每台计算机上都安装这些字体. •Courier New(TrueType,包括粗体.斜体和粗斜体这几种变体) •Arial(TrueType,包括粗体.斜体和粗斜体这几种变体) •Times New Roman(TrueType,包括粗体.斜体和粗斜体这几种变体) •Symbol (TrueType) •Wingdings (TrueType) •MS Serif •MS Sans Serif 如果缺少 Windows

Windows中安装Apache2和PHP4权威指南

apache|window Apache 2和PHP是创建交互式网站的流行方案,而且成本很低.在Windows中安装Apache 2是一件轻而易举的事情,但要使PHP 4与Apache 2配合无间地运行,就需要一定的技巧. 在PHP 4.3手册的Windows安装小节,没有解释如何让PHP与Apache 2配合使用,而有关Apache 2安装的小节缺失了你需要的大量信息.在网上公布的其他安装指南中,也包含了不少错误,使一些安装人员只好不断试验和犯错.例如,有些人甚至将PHP的DLL替换成其他PH