Python docker run导致启动容器进程;执行官:\"/boot.sh\";:拒绝许可

Python docker run导致启动容器进程;执行官:\"/boot.sh\";:拒绝许可,python,docker,flask,Python,Docker,Flask,我正在关注Miguel Grinberg的Flask Web开发[第二版]。在第三部分第17章中,它说明了如何将项目部署到Docker。我在VMware上使用Ubuntu 18.04 LTS 通过运行docker build-t flasky:latest.,我成功地构建了一个容器映像 运行docker imagesI验证映像是否已成功创建 我无法使用以下命令运行容器: boot.sh: #!/bin/sh source venv/bin/activate flask deploy exec g

我正在关注Miguel Grinberg的Flask Web开发[第二版]。在第三部分第17章中,它说明了如何将项目部署到Docker。我在VMware上使用Ubuntu 18.04 LTS

  • 通过运行
    docker build-t flasky:latest.
    ,我成功地构建了一个容器映像
  • 运行
    docker images
    I验证映像是否已成功创建
  • 我无法使用以下命令运行容器:
  • boot.sh:

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

    我尝试了来自和的解决方案。问题依然存在。有什么办法可以解决吗?

    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构建-

    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
    

    TL;DR
    chmod a+x boot.sh
    chmod o+x boot.sh

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

    假设您在主机中以用户
    app\u user
    的身份在group
    app\u group
    下运行,并尝试让脚本正确执行,如
    chmod+x boot.sh
    。它只允许用户
    app\u user
    执行脚本

    如果执行命令
    chmod g+x boot.sh
    ,则属于
    app\u组的任何用户都可以执行该命令

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


    出现所有这些问题的原因是,在Linux中,容器中的用户id直接映射到主机中的用户id。

    您是否尝试在输入脚本中将
    chown
    设置为您的用户。同时在itI上设置
    chmod 4755
    ,我还没有尝试过
    chown
    ,但我会在以后记下它。谢谢我已经使用下面给出的解决方案之一解决了这个问题。这个问题在
    chmod+x boot.sh
    之后仍然存在,但这是一个很好的解决方案。按照Nguyen Lam Phuc的建议,使用chmod a+x boot.sh更改权限有效。
    root@qa9phx:~/amitp/p3# docker images
    REPOSITORY                             TAG                                      IMAGE ID            CREATED             SIZE
    flasky                                 latest                                   6d10284c0d9e        8 minutes ago       94.6MB
    
    root@qa9phx:~/amitp/p3# docker run -it 6d10284c0d9e bash
    hello world