运行 bash 脚本的 docker 入口点得到“权限被拒绝”

新手上路,请多包涵

我正在尝试 dockerize 我的 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"]

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

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

/usr/bin/node server.js

构建此映像并运行后:

 docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>

我越来越:

 docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

我shell进入容器,docker-entrypoint.sh的权限是:

 -rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh

三个问题:

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

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

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

谢谢。

原文由 Calvin Hu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答
  1. “权限被拒绝” 完全阻止您的脚本被调用。 因此,唯一可能相关的语法是第一行的语法(“shebang”),它应该看起来像 #!/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 ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]

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

原文由 Charles Duffy 发布,翻译遵循 CC BY-SA 3.0 许可协议

可执行文件需要具有执行集权限才能执行。

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

 ls -la path/to/directory

可执行文件(在本例中为 docker-entrypoint.sh)的输出的第一列应设置可执行位,如下所示:

 -rwxrwxr-x

如果没有,请尝试:

 chmod +x docker-entrypoint.sh

然后再次构建您的 docker 映像。

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

原文由 Sami Start 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题