docker入口点运行bash脚本时出现"permission denied"错误。

9 浏览
0 Comments

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

  1. 我的bash脚本语法有问题吗?
  2. \n

  3. 如何在将bash文件添加到镜像之前更改其权限?
  4. \n

  5. 在ENTRYPOINT中运行多个git命令的最佳方法是什么,而不使用bash脚本?
  6. \n

\n谢谢。

0
0 Comments

问题: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设置为脚本本身并确保脚本具有可执行权限来解决该问题。第二种方法更为推荐,因为它遵循了脚本的指定解释器,并确保使用了正确的权限。

0
0 Comments

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会从主机复制权限到镜像中。

0
0 Comments

在使用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的问题,并提供一个最小可重现的示例,以便其他人可以帮助解决问题。

0