【问题标题】:"Permission denied" on file when running a docker container运行 docker 容器时文件上的“权限被拒绝”
【发布时间】:2021-02-02 00:58:01
【问题描述】:

我有一个无法编辑但需要在 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.

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

【问题讨论】:

    标签: dockerfile chmod docker-image docker-run


    【解决方案1】:

    你可以试试这个简单的。

    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 命令登录到容器并手动查看您的命令是否有效

    【讨论】:

    • 我已经尝试了"/bin/bash" 的步骤。并根据您的建议出现错误:: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown.
    • 我给的是样品。确保路径正确。检查使用哪个命令。哪个 bash 或哪个 sh
    • 如何让“bash”运行? Bash 不在 alpine 中,在我手动添加后,我遇到了“bash”cannot execute binay file 的问题
    • 正如 OP 所指出的,Alpine 不附带 bash,因此当前形式的这个示例永远不会运行。请修改。
    【解决方案2】:

    看来你使用的是CMD的exec形式,如图here

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

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

    或者你可以使用 shell 形式:

    CMD /home/guestuser/bin/gateway
    

    如果您需要一个 shell,您也可以以 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 只会在您第一次构建容器时显示

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2020-11-02
      • 2018-08-06
      • 2022-01-12
      • 2018-10-31
      相关资源
      最近更新 更多