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

我试图dockerize我的node.js应用程序。 当容器被构build时,我希望它运行一个git clone ,然后启动节点服务器。 所以我把这些操作放在一个.sh脚本中。 并且在入口点执行脚本作为单个命令:

 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 

build立这个图像后,运行:

 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. 在入口点运行多个git命令而不使用bash脚本的最佳方式是什么?

谢谢。

  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 (明确logging以保留元数据)。

可执行文件需要具有执行设置的权限才能执行。

在你的机器里,你正在build造docker图片(不在docker图片本身内),试着运行:

 ls -la path/to/directory 

你的可执行文件(在这个例子中是docker-entrypoint.sh)的输出的第一列应该有可执行位设置如下:

 -rwxrwxr-x 

如果没有,那就试试:

 chmod +x docker-entrypoint.sh 

然后再build立你的docker图像。

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