【问题标题】:docker run results in starting container process caused "exec: \"./boot.sh\": permission denieddocker run 导致启动容器进程导致 "exec: \"./boot.sh\": permission denied
【发布时间】:2020-02-08 13:40:31
【问题描述】:

我正在关注 Miguel Grinberg 的 Flask Web Development [第 2 版]。第三部分第 17 章介绍了如何将项目部署到 Docker。我在 VMware 上使用 Ubuntu 18.04 LTS。

  1. 我通过运行docker build -t flasky:latest .成功构建了一个容器镜像。
  2. 运行docker images 我验证图像已成功创建。
  3. 我无法使用以下方法运行容器:
docker run --name flasky -d -p 8000:5000 \
-e SECRET_KEY=<secret_key> \
-e MAIL_USERNAME=<my_email> \
-e MAIL_PASSWORD=<my_password> flasky:latest

结果我得到这个错误:

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:346:启动容器进程导致“exec:\”./boot.sh\“:权限被拒绝”:未知。

我尝试使用chmod 修改权限,但无济于事。再说一次,也许我做错了。

Dockerfile:

FROM python:3.6-alpine

ENV FLASK_APP flasky.py
ENV FLASK_CONFIG docker

RUN adduser -D flasky
USER flasky

WORKDIR /home/flasky

COPY requirements requirements
RUN python -m venv venv
RUN venv/bin/pip install -r requirements/docker.txt

COPY app app
COPY migrations migrations
COPY flasky.py config.py boot.sh ./

# runtime configuration
EXPOSE 5000
ENTRYPOINT ["./boot.sh"]

boot.sh:

#!/bin/sh
source venv/bin/activate
flask deploy
exec gunicorn -b 0.0.0.0:5000 --access-logfile - --error-logfile - flasky:app

我尝试了herehere 的解决方案。问题仍然存在。任何想法如何解决它?

【问题讨论】:

  • 您是否尝试在您的用户输入脚本上设置chown。并在上面设置chmod 4755
  • 我还没有尝试过chown,但我会留意它以备将来使用。谢谢!我已经使用下面给出的解决方案之一解决了这个问题。

标签: python docker flask


【解决方案1】:

TL;DRchmod a+x boot.shchmod o+x boot.sh

您在容器USER flasky 内以用户flasky 运行,结果以该用户身份执行boot.sh 脚本。这里的问题是flasky没有执行脚本的权限。

假设您在主机中以用户 app_user 的身份在组 app_group 下运行,并尝试像 chmod +x boot.sh 一样赋予脚本执行权。它将只允许用户app_user 执行脚本。

如果您执行命令chmod g+x boot.sh,它将允许属于组app_group 的任何用户能够执行它。

由于我们从未在主机中为app_user 或容器中的flasky 用户指定任何ID,因此您必须运行命令chmod a+x boot.shchmod o+x boot.sh,从而授予其他用户执行boot.sh 的权限.

所有这些麻烦的原因是因为在Linux中,容器中的用户ID直接映射到主机中的用户ID。

【讨论】:

    【解决方案2】:

    chmod +x boot.sh 应该可以解决您的问题。我可以在chmod +x 未完成时重现该问题-

    root@qa9phx:~/amitp/p3# docker run -it 62591cab9f07 bash
    docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"./boot.sh\": permission denied": unknown.
    

    这是我使用的示例 Dockerfile-

    FROM python:3.6-alpine
    
    COPY boot.sh ./
    # runtime configuration
    EXPOSE 5000
    ENTRYPOINT ["./boot.sh"]
    

    这是示例 boot.sh

    #!/bin/sh
    echo "hello world"
    

    在构建 docker 之前运行以下命令

    chmod +x boot.sh
    

    然后是docker build-

    docker build -t flasky:latest .
    

    Docker 镜像列表-

    root@qa9phx:~/amitp/p3# docker images
    REPOSITORY                             TAG                                      IMAGE ID            CREATED             SIZE
    flasky                                 latest                                   6d10284c0d9e        8 minutes ago       94.6MB
    

    Docker 运行命令-

    root@qa9phx:~/amitp/p3# docker run -it 6d10284c0d9e bash
    hello world
    

    【讨论】:

    • chmod +x boot.sh 之后问题仍然存在,但这是一个千钧一发的问题。 Nguyen Lam Phuc 建议使用chmod a+x boot.sh 更改权限有效。
    猜你喜欢
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多