在运行 Docker 时出现权限被拒绝的问题

55

我正在尝试使用Dockerfile使用Docker。

我的Dockerfile如下,其中我使用了debian Linux系统。

FROM debian:jessie

ENV DEBIAN_FRONTEND noninteractive

ARG AIRFLOW_VERSION=1.7.1.3
ENV AIRFLOW_HOME /usr/local/airflow

..
..

COPY script/entrypoint.sh /entrypoint.sh
COPY config/airflow.cfg ${AIRFLOW_HOME}/airflow.cfg
..
..    
USER airflow
WORKDIR ${AIRFLOW_HOME}
ENTRYPOINT ["/entrypoint.sh"]

当我运行docker build -t test .时,它可以顺利构建。
但是,当我运行docker run -p 8080:8080 test时,
它会抛出以下错误:
container_linux.go:247: starting container process caused "exec: \"/entrypoint.sh\": permission denied"
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"/entrypoint.sh\": permission denied".

我做错了什么?

16
在应用程序代码库中执行以下操作:chmod +x entrypoint.sh - Robert
1
罗伯特是正确的。container_linux.go:247 错误只是指来自容器的 ENTRYPOINT 或 CMD 抛出的错误。在这种情况下,是一个权限问题。 - mkasberg
你是对的罗伯特,谢谢。 - Kush Patel
1
我遇到了类似的错误,因为我尝试使用 docker run 命令运行一个目录(复制/粘贴错误),而不是可执行文件。 - GuiTeK
4个回答

98

在调用ENTRYPOINT之前,您需要通过 chmod +x entrypoint.sh 更改bash文件的权限。因此,请将您的代码更改为以下内容:

USER airflow
WORKDIR ${AIRFLOW_HOME}
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

重新构建镜像并运行容器,应该可以正常工作。


2
我按照您的建议编辑了代码,但仍然遇到相同的权限被拒绝错误。以下是问题所在的Google Cloud Platform教程链接:[https://cloud.google.com/cloud-build/docs/quickstart-docker?]FROM alpine COPY quickstart.sh / RUN chmod +x quickstart.sh CMD ["/quickstart.sh"]docker run gcr.io/autotagging-api/quickstart-imageOCI运行时创建失败:container_linux.go:346:启动容器进程导致“exec:"/quickstart.sh":permission denied”:unknown。我正在运行Windows版的Docker桌面应用程序。 - Brigitte Maillère
1
添加 RUN 并没有解决任何问题。我不得不将其应用于本地文件以测试一切是否正常运行,但仍然被阻止,因为使用 RUN 时权限未发生更改。 - mtpultz
RUN 命令无法工作的原因是什么?在添加 RUN chmod +x entrypoint.sh 后,我仍然遇到 unable to start container process: exec: "/usr/app/entrypoint.sh": permission denied: unknown。基本上,我不得不使用 Dinei 在下面给出的答案 (https://dev59.com/flcP5IYBdhLWcg3wP3wU#69483712)。 - StephenWeiss

16

由于COPY命令会复制包括元数据在内的文件,所以您可以直接在构建Docker镜像的主机上更改文件权限:

$ chmod +x entrypoint.sh

然后,当运行docker build -t test .时,复制的文件将具有执行权限,并且docker run -p 8080:8080 test应该可以工作。

注意:我并不认为这是最佳实践,但仍然可以工作。


7

在您的终端中运行 "chmod +x entrypoint.sh"

或者如果entrypoint.sh文件在一个文件夹中,请运行 "chmod +x folder_name/entrypoint.sh"


-2

我在docker文件夹中更改了入口点的位置并重新构建,然后它就可以工作了!


1
你能详细说明一下吗? - stdunbar
当然,我已经在 Dockerfile 中将路径从 /entrypoint 替换为 /user/local/entrypoint 并重新构建了镜像。 - B.Mind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接