我试图dockerize我的node.js应用程序。当容器构建时,我希望它运行一个git克隆,然后启动节点服务器。因此,我将这些操作放在.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

三个问题:

我的bash脚本有错误的语法吗? 如何在将bash文件添加到映像之前更改其权限? 在入口点运行多个git命令而不使用bash脚本的最佳方法是什么?

谢谢。


当前回答

这可能有点愚蠢,但我得到的错误消息是“许可被拒绝”,它让我在一个非常错误的方向上螺旋式下降,试图解决它。(这里举个例子)

我自己甚至没有添加任何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

但最后你甚至不应该有一个点,它被错误地添加到另一个项目的docker image文档中。你应该简单地运行:

docker run -p 80:80 [name]

我很喜欢Docker,但遗憾的是它有这么多这样的陷阱,而且错误信息并不总是非常清晰……

其他回答

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

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

运行 ls -al

如果result get -rw-r——r——,

运行 Chmod +x docker-entrypoint.sh

在docker构建之前!

如果你尝试在docker的入口点运行脚本时仍然得到Permission denied错误,请尝试不要使用入口点的shell形式:

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

https://docs.docker.com/engine/reference/builder/#entrypoint

删除Dot [.]

这个问题最后花了我3个多小时,我只是试了一下这个问题是在去掉最后的点而已。

问题是

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

/usr/local/bin/docker-entrypoint.sh: 8: exec: .:权限被拒绝

只需从命令行末尾删除dot:

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

这可能有点愚蠢,但我得到的错误消息是“许可被拒绝”,它让我在一个非常错误的方向上螺旋式下降,试图解决它。(这里举个例子)

我自己甚至没有添加任何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

但最后你甚至不应该有一个点,它被错误地添加到另一个项目的docker image文档中。你应该简单地运行:

docker run -p 80:80 [name]

我很喜欢Docker,但遗憾的是它有这么多这样的陷阱,而且错误信息并不总是非常清晰……

这是一个在我回答这个问题两年前被问到的老问题,无论如何我都要把对我有用的东西贴出来。

在我的工作目录中,我有两个文件: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 .sh,我能够使docker容器中的文件可执行。