docker入口点运行bash脚本时出现"permission denied"错误。
docker入口点运行bash脚本时出现"permission denied"错误。
我正在尝试将我的node.js应用程序docker化。当容器构建完成后,我希望它能运行一个git clone
命令,然后启动node服务器。因此,我将这些操作放在一个.sh脚本中,并将脚本作为一个单独的命令在ENTRYPOINT中运行:\n
FROM ubuntu:14.04 RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git #安装gcc 4.9 RUN apt-get install -y software-properties-common python-software-properties RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test RUN apt-get update RUN apt-get install -y libstdc++-4.9-dev #安装最新版本的nodejs RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - RUN apt-get install -y nodejs RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ADD package.json /usr/src/app/ RUN npm install ADD docker-entrypoint.sh /usr/src/app/ EXPOSE 8080 ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
\n我的docker-entrypoint.sh脚本如下:\n
git clone git@.git git add remote upstream git@ .git /usr/bin/node server.js
\n构建这个镜像并运行后,我遇到了以下错误:\n
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
\n我进入容器并查看docker-entrypoint.sh的权限:\n
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
\n三个问题:\n
- \n
- 我的bash脚本语法有问题吗?
- 如何在将bash文件添加到镜像之前更改其权限?
- 在ENTRYPOINT中运行多个git命令的最佳方法是什么,而不使用bash脚本?
\n
\n
\n
\n谢谢。
问题:docker entrypoint运行bash脚本时出现"permission denied"的错误。
原因:该问题的原因是权限问题。在Dockerfile中设置的entrypoint为sh,但是bash脚本的执行权限不足,导致无法运行。
解决方法:有两种解决方法。一种是将entrypoint设置为sh,并指定bash脚本的绝对路径。另一种是将entrypoint设置为脚本本身,并确保脚本具有可执行权限。
第一种解决方法是在Dockerfile中设置entrypoint为sh,并指定bash脚本的绝对路径。例如:
ENTRYPOINT ["sh", "/docker-entrypoint.sh"]
对于原问题中的Dockerfile,应该是这样的:
ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]
然而,这种方法只是一个权宜之计,并不是一个很好的解决方案。因为这种方法会忽略脚本中指定的解释器,而是用sh来解释脚本。这样就会忽略脚本中使用的一些bash特性,如[[ ]], 数组等。
第二种解决方法是将entrypoint设置为脚本本身,并确保脚本具有可执行权限。例如:
ENTRYPOINT ["/docker-entrypoint"]
同时,需要在脚本中添加合适的shebang行,指定要使用的解释器,并确保脚本具有可执行权限。
这种方法是更好的解决方案,因为它遵循了脚本的指定解释器,并确保使用了正确的权限。
当Docker entrypoint运行bash脚本时出现"permission denied"的错误时,可以通过设置entrypoint为sh并指定脚本路径,或者将entrypoint设置为脚本本身并确保脚本具有可执行权限来解决该问题。第二种方法更为推荐,因为它遵循了脚本的指定解释器,并确保使用了正确的权限。
docker entrypoint运行bash脚本时出现"permission denied"的问题可能是由于可执行文件没有执行权限引起的。在构建docker镜像的机器上执行以下命令可以解决该问题:
ls -la path/to/directory
输出结果中可执行文件(本例中是docker-entrypoint.sh)的第一列应该包含可执行位,类似于:
-rwxrwxr-x
如果没有,可以尝试以下命令:
chmod +x docker-entrypoint.sh
然后再次构建docker镜像。Docker使用自己的文件系统,但会从源目录中复制所有内容(包括权限位)。在主机上执行chmod +x docker-entrypoint.sh
的方法实际上是推荐的解决方法,因为它比更改Dockerfile要简单得多。
这对我起作用了,尽管我真的不明白为什么会这样xD。如果你遇到这个问题,我希望能知道背后的原因。
如果你使用的是posix兼容的文件系统(例如macos、linux或一些bsd),那么docker会从主机上复制权限。但在Windows上就不同了,所以它只会添加权限。
当在docker中运行bash脚本时出现"permission denied"的问题,可能是由于可执行文件没有执行权限引起的。可以通过在构建docker镜像的机器上执行chmod +x docker-entrypoint.sh
命令来解决该问题。这是推荐的解决方法,因为Docker会从主机复制权限到镜像中。
在使用Docker时,有时可能会遇到"docker entrypoint running bash script gets 'permission denied'"的问题,即执行Docker容器中的bash脚本时出现"permission denied"的错误。
造成这个问题的可能原因是脚本没有被标记为可执行。这个问题可以通过在Docker容器中添加以下命令来解决:
RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]
这样可以在容器中将脚本的执行权限设置为可执行。
另一种解决方法是确保Dockerfile文件中引用的本地脚本已经被设置为可执行,并且使用COPY
命令将脚本复制到容器中。需要注意的是,COPY
命令会保留脚本的元数据信息。
如果在挂载点上使用了noexec
标志,可以通过运行bash yourscript
而不是./yourscript
来运行脚本。
有时候,当使用docker build
命令构建镜像时,中间容器可以正常工作,但是当使用docker run
命令运行容器时,会出现上述错误。这可能是因为在构建镜像时使用了一个中间容器,而运行容器时使用了另一个容器。
另外,有用户反映在Docker镜像中使用RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]
或RUN ["chmod", "a+x", "/usr/src/app/docker-entrypoint.sh"]
命令无法改变容器中脚本的权限。这可能是由于其他原因导致的,例如文件系统权限的设置问题。
如果遇到以上问题,可以创建一个包含Dockerfile的问题,并提供一个最小可重现的示例,以便其他人可以帮助解决问题。