首页 文章

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

提问于
浏览
40

我正在尝试将我的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.

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

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

三个问题:

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

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

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

谢谢 .

3 回答

  • 82
    • "Permission denied"会阻止您的脚本被调用 . 因此,唯一可能相关的语法是第一行("shebang")的语法,它应该看起来像 #!/usr/bin/env bash ,或 #!/bin/bash ,或类似的,具体取决于目标的文件系统布局 .

    • 很可能文件系统权限未设置为允许执行 . 它's also possible that the shebang references something that isn' t可执行,但这不太可能 .

    • 轻松修复先前的问题 .


    简单的阅读

    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 (显式记录以保留元数据) .

  • 1

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

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

    ls -la path/to/directory
    

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

    -rwxrwxr-x
    

    如果没有,那么尝试:

    chmod +x docker-entrypoint.sh
    

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

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

  • 22

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

    ENTRYPOINT ["sh", "/docker-entrypoint.sh"]
    

    对于原始问题中的Dockerfile,它应该是:

    ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]
    

相关问题