运行Docker容器时文件上的“权限被拒绝”

时间:2020-10-19 08:57:08

标签: dockerfile chmod docker-image docker-run

我有一个无法编辑的文件,但需要在Docker容器中运行。因为文件没有扩展名,所以我必须使用chmod来设置文件可执行文件。但是,从docker文件构建docker映像后,我总是得到一个"permission denied" error

我的docker文件:

FROM alpine

COPY . /home/guestuser/bin/gateway

RUN apk add libressl-dev
RUN apk add libffi-dev

RUN pwd

WORKDIR /home/guestuser/bin/.
RUN ["chmod", "+x", "gateway"]

RUN pwd

CMD ["/home/guestuser/bin/gateway"]


EXPOSE 11878

我总是会收到此错误:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/home/guestuser/bin/gateway\": permission denied": unknown.

正如我已经提到的,我无法编辑要执行的文件。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

您可以尝试这个简单的方法。

FROM alpine
COPY . /home/guestuser/bin/gateway
RUN apk add libressl-dev
RUN apk add libffi-dev
WORKDIR /home/guestuser/bin/
RUN chmod -R 755 /home/guestuser
CMD ["/bin/bash", "/home/guestuser/bin/gateway"]

否则,请运行sleep命令登录到容器,并查看您的命令是否可以手动运行

答案 1 :(得分:0)

您似乎正在使用CMD的exec形式,如图here

有两种使用CMD的方法。第一种是您已经执行的方式,以exec形式:

CMD ["/home/guestuser/bin/gateway"]

或者您可以使用shell形式:

CMD /home/guestuser/bin/gateway

如果您需要外壳,还可以以exec形式显式调用一个外壳,这正是Ganesh所建议的。

CMD ["sh", "/home/guestuser/bin/gateway"]

但是,如果该语法正确,为什么它不起作用?

好吧,因为这假设gateway文件。问题是...可能不是。

运行此命令时:

COPY . /home/guestuser/bin/gateway

从参考文献:

可以指定多个资源,但是文件和目录的路径将被解释为相对于构建上下文的源。

您要将构建上下文的整个内容复制到目录 /home/guestuser/bin/gateway。如果要复制特定文件,则应明确命名该文件,而不要使用.。COPY命令的语法首先是源,然后是目标,如here所示。

因此,当您尝试执行网关时,可能正在“执行”名为网关的目录。只要构建上下文中有多个文件,网关将是一个目录。这可能包括Dockerfile本身,因此,即使构建上下文是仅包含Dockerfile和要运行的脚本的文件夹,您仍将同时提取这两个文件,这会将网关本身转换为目录。

可以尝试的测试

为证明您的Dockerfile CMD语法正确,请尝试将该CMD更改为以下内容:

CMD ["top"]

类似地,您可以删除CMD并仅以交互方式运行容器。它将把您放到您的WORKDIR中,除了网关目录外,该目录为空,其中包含在构建过​​程中提取的任何目录结构的内容。

因此,要使其工作,请更改COPY行以命名所需的脚本:

COPY somescript /home/guestuser/bin/gateway

其他说明:

  • 您的默认用户是root,因此您不需要chmod网关
  • RUN pwd仅在您首次构建容器时显示
相关问题