问题描述
我有一个无法编辑的文件,但需要在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.
正如我已经提到的,我无法编辑要执行的文件。我在做什么错了?
解决方法
您可以尝试这个简单的方法。
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命令登录到容器,并查看您的命令是否可以手动运行
,您似乎正在使用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
仅在您首次构建容器时显示