docker entrypoint运行bash脚本获得"权限被拒绝"

Cal*_* Hu 86 bash shell docker

我正在尝试将我的node.js应用程序停靠.构建容器时,我希望它运行一个git clone然后启动节点服务器.因此,我将这些操作放在.sh脚本中.并在ENTRYPOINT中将脚本作为单个命令运行:

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git

#install 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

#install newst 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"] 
Run Code Online (Sandbox Code Playgroud)

我的docker-entrypoint.sh看起来像这样:

git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git

/usr/bin/node server.js
Run Code Online (Sandbox Code Playgroud)

构建此图像并运行后:

docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>
Run Code Online (Sandbox Code Playgroud)

我越来越:

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Run Code Online (Sandbox Code Playgroud)

我进入容器并且docker-entrypoint.sh的权限是:

-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
Run Code Online (Sandbox Code Playgroud)

三个问题:

  1. 我的bash脚本是否有错误的语法?

  2. 如何在将bash文件添加到图像之前更改bash文件的权限?

  3. 在不使用bash脚本的情况下在入口点运行多个git命令的最佳方法是什么?

谢谢.

Cha*_*ffy 133

  1. 拒绝"权限"避免你的脚本被调用在所有.因此,这可能是可能有关的唯一语法是第一行(以下简称"认领"),它应该是什么样子#!/usr/bin/env bash,或者#!/bin/bash,或者类似的取决于你的目标的文件系统布局.

  2. 很可能文件系统权限未设置为允许执行.shebang也可能引用了不可执行的东西,但这种可能性小得多.

  3. 通过修复先前问题的简易性来扼杀.


简单的阅读

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Run Code Online (Sandbox Code Playgroud)

...是脚本未标记为可执行文件.

RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

将在容器内解决这个问题.或者,您可以确保Dockerfile引用的本地副本是可执行的,然后使用COPY(显式记录以保留元数据).

  • 我不明白,当我运行“docker build”时,中间容器工作正常。但是当我执行“docker run”时,它会抛出这样的错误。看起来像是我拥有的一个神奇的中间容器。 (3认同)
  • @raupie,如果您想从带有 `noexec` 标志的挂载点运行脚本,请运行 `bash yourscript` 而不是 `./yourscript`。 (2认同)

rum*_*rum 42

问题是由于原始文件没有执行权限。

检查原始文件是否有权限。

跑步ls -al

如果结果得到-rw-r--r--,

跑步
chmod +x docker-entrypoint.sh

在 docker 构建之前!


Sam*_*art 36

可执行文件需要具有执行集的权限才能执行它.

在您正在构建docker镜像的机器中(不在docker镜像本身内)尝试运行:

ls -la path/to/directory
Run Code Online (Sandbox Code Playgroud)

可执行文件的输出的第一列(在本例中为docker-entrypoint.sh)应该具有如下可执行位:

-rwxrwxr-x
Run Code Online (Sandbox Code Playgroud)

如果没有,那么尝试:

chmod +x docker-entrypoint.sh
Run Code Online (Sandbox Code Playgroud)

然后再次构建您的docker镜像.

Docker使用它自己的文件系统,但它会复制源目录中的所有内容(包括权限位).

  • 主机上的`chmod + x docker-entrypoint.sh`实际上是推荐的解决方案,因为它比更改`Dockerfile`简单得多. (12认同)

小智 9

授予文件执行权限docker-entrypoint.sh

sudo chmod 775 docker-entrypoint.sh
Run Code Online (Sandbox Code Playgroud)


Sau*_*cdt 6

我遇到了同样的问题,并且解决了

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

对于原始问题中的Dockerfile,它应类似于:

ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

  • 这是一个解决方法,但不是一个很好的解决方法–会使用`sh`解释脚本,而忽略了shebang的解释器规范;因此,如果它使用`#!/ bin / bash`,说它想用bash解释,它将被忽略,而是用`sh`解释,因此不允许使用像[[]]这样的语言功能,数组等 (5认同)

Abd*_*leh 5

点 [.]

这个问题最终困扰了我3个多小时,我刚试过问题出在从末尾删除

问题是

docker run  -p 3000:80 --rm --name test-con test-app .
Run Code Online (Sandbox Code Playgroud)

/usr/local/bin/docker-entrypoint.sh: 8: exec: .: 权限被拒绝

只需从命令行末尾删除

docker run  -p 3000:80 --rm --name test-con test-app 
Run Code Online (Sandbox Code Playgroud)