运行bash脚本的docker入口点获取;“拒绝许可”;
我正在尝试对node.js应用程序进行dockerize。构建容器时,我希望它运行一个运行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
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
三个问题:
#/usr/bin/env bash
,或#/bin/bash
,或类似文件,具体取决于目标的文件系统布局简读
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
writeENTRYPOINT[“/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