Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行bash脚本的docker入口点获取;“拒绝许可”;_Bash_Shell_Docker - Fatal编程技术网

运行bash脚本的docker入口点获取;“拒绝许可”;

运行bash脚本的docker入口点获取;“拒绝许可”;,bash,shell,docker,Bash,Shell,Docker,我正在尝试对node.js应用程序进行dockerize。构建容器时,我希望它运行一个git克隆,然后启动节点服务器。因此,我将这些操作放在.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 s

我正在尝试对node.js应用程序进行dockerize。构建容器时,我希望它运行一个
git克隆
,然后启动节点服务器。因此,我将这些操作放在.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
I将外壳放入容器中,docker-entrypoint.sh的权限为:

-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
三个问题:

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

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

  • 在entrypoint中运行多个git命令而不使用bash脚本的最佳方式是什么

  • 谢谢

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

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

  • 讨论了修复先前问题的难易性


  • 简读

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

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

    在构建docker映像的计算机中(不在docker映像内部),尝试运行:

    ls -la path/to/directory
    
    可执行文件(在本例中为docker entrypoint.sh)输出的第一列应将可执行文件位设置为:

    -rwxrwxr-x
    
    如果没有,请尝试:

    chmod +x docker-entrypoint.sh
    
    然后再次建立你的docker形象


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

    我也遇到了同样的问题&由

    ENTRYPOINT ["sh", "/docker-entrypoint.sh"]
    
    对于原始问题中的Dockerfile,它应该如下所示:

    ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]
    
    如果不使用DockerFile,只需添加权限作为bash的命令行参数:

    docker run -t <image>  /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"
    
    docker run-t/bin/bash-c“chmod+x/usr/src/app/docker-entrypoint.sh;/usr/src/app/docker-entrypoint.sh”
    
    这是我两年前提出的一个老问题,不管怎样,我要发布对我有用的东西

    在我的工作目录中有两个文件:Dockerfile&provision.sh

    Dockerfile:

    FROM centos:6.8
    
    # put the script in the /root directory of the container
    COPY provision.sh /root
    
    # execute the script inside the container
    RUN /root/provision.sh
    
    EXPOSE 80
    
    # Default command
    CMD ["/bin/bash"]
    
    provision.sh:

    #!/usr/bin/env bash
    
    yum upgrade
    

    通过将容器外部的文件设置为可执行文件
    chmod 700 provision.sh
    ,然后运行
    docker build,我可以使docker容器中的文件可执行。

    这可能有点愚蠢,但我收到的错误消息是权限被拒绝,它让我朝着一个非常错误的方向向下旋转试图解决它。(这里举个例子)

    我自己甚至还没有添加任何bash脚本,我想其中一个是由我使用的nodejs图像添加的

    FROM node:14.9.0
    
    我错误地运行以暴露/连接本地计算机上的端口:

    docker run -p 80:80 [name] . # this is wrong!
    

    /usr/local/bin/docker-entrypoint.sh: 8: exec: .: Permission denied
    
    但你甚至不应该在最后有一个点,它是由misstake添加到另一个项目docker图像的文档中的您只需运行

    docker run -p 80:80 [name]
    
    我非常喜欢Docker,但遗憾的是,它有这么多这样的陷阱,而且错误信息并不总是很清楚……

    Dot[。] 这个问题花了我3个多小时。最后,我试了一下,问题出在刚刚从末尾删除

    问题是

    docker run  -p 3000:80 --rm --name test-con test-app .
    
    /usr/local/bin/docker-entrypoint.sh:8:exec::权限被拒绝

    只需从命令行末尾删除点即可:

    docker run  -p 3000:80 --rm --name test-con test-app 
    

    如果在docker的入口点中运行脚本时仍出现
    权限被拒绝的错误,请尝试不要使用入口点的shell表单

    而不是:
    ENTRYPOINT./bin/watcher
    write
    ENTRYPOINT[“/bin/watcher”]


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

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

    运行
    ls-al

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

    运行

    chmod+x docker entrypoint.s


    在docker建造之前

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

    sudo chmod 775 docker-entrypoint.sh
    

    我们需要查看文件权限才能回答这个问题。顺便说一句,如果这是一个bash脚本,而不是sh脚本,
    .sh
    扩展名会对哪些口译员可以执行它留下错误的印象。你可以考虑把它拿出来——对于UNIX命令有扩展是不常规的(例如,你不运行代码> ls。ELF < /代码>)。它不需要
    bash
    前缀吗?@Jean-Françoisfare,你的问题到底是什么意思?(我不明白“以那种方式执行shell”是什么意思——在这个上下文中“以那种方式”是什么?)顺便问一下,这个愚蠢的问题——在将脚本权限添加到图像之前,脚本的权限是否正确?我想你是对的。我应该用复印件代替。但在复制bash脚本之后,我似乎仍然需要更改权限。我有一个phar文件,它根据命令创建.bash脚本,然后在完成后将其删除。因此,我仍在努力解决共享卷需要设置执行权限的问题。@raupie,如果您想使用
    noexec
    标志从装载点运行脚本,请运行
    bash-yourscript
    ,而不是
    /yourscript
    。当我运行
    docker-build
    时,我不会理解
    docker run  -p 3000:80 --rm --name test-con test-app 
    
    sudo chmod 775 docker-entrypoint.sh