无法直接在Docker卷上执行脚本

时间:2019-02-06 13:48:00

标签: docker

环境:

Docker version 18.06.1-ce, build e68fc7a
Description:    Ubuntu 18.04.1 LTS
Storage Driver: overlay2

Aforementioned volume: 
        {
            "Type": "volume",
            "Name": "xxx",
            "Source": "/var/lib/docker/volumes/xxx/_data",
            "Destination": "/tmp",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        },

当我尝试在此目录中创建脚本(尝试使用另一个docker-plugin复制问题)时:touch init.sh && chmod +x init.sh && ./init.sh,我遇到“权限被拒绝”失败。

标记似乎已由chmod正确设置:-rwxr-xr-x 1 root root

脚本可以在任何其他目录中启动,但不能在卷上启动。

最有趣的是,使用命令bash init.sh启动脚本即可!

这种奇怪行为的原因可能是什么?如何解决?

2 个答案:

答案 0 :(得分:1)

正在努力尝试并复制。

这一系列命令有效。

docker volume create mine
docker run -it -v mine:/tmp ubuntu bash
touch init.sh && chmod +x init.sh && ./init.sh

检查音量-

        {
            "Type": "volume",
            "Name": "mine",
            "Source": "/var/lib/docker/volumes/mine/_data",
            "Destination": "/tmp",
            "Driver": "local",
            "Mode": "z",
            "RW": true,
            "Propagation": ""
        }

区别在于“模式”,我认为是“ z”,因为我没有运行selinux。

我尝试了一些其他方法来重复您的问题

docker run -it --mount type=volume,source=mine,target=/tmp,readonly ubuntu bash -c "cd /tmp && touch init.sh && chmod +x init.sh && ./init.sh"
touch: cannot touch 'init.sh': Read-only file system

但是我不能。 通过查看一些链接,我发现了此问题,该链接指向文章 https://github.com/moby/moby/issues/7054 https://lwn.net/Articles/281157/

文章说,绑定装载从装载继承装载选项(例如noexec)。那么...您的docker文件夹是否位于通过noexec挂载的挂载上?

答案 1 :(得分:0)

我想是因为/tmp的POSIX不允许您执行脚本。 您可以通过发出getfacl init.sh来验证。

使用chmod +x init.sh,仅将所有用户的执行权限添加到现有权限中。

通过使用chmod 755 init.sh,您可以设置所有者的完整权限以及其他用户的读取和执行权限。

我认为应该可以解决问题。