无法在 Google 容器优化 OS 上 运行 执行 shell 脚本
Cannot run executable shell script on Google Container-Optimized OS
在任何其他 linux 发行版上,我可以创建一个带有 shebang 和 运行 shell 脚本的文件,如下所示:
$ chmod +x test.sh
$ ./test.sh Johnny
hello Johnny
但是在 Google Cloud Platform Container-Optimized OS 上,我得到 -bash: ./test.sh: Permission denied
如果我以 sh
作为前缀,例如sh test.sh Johnny
它会起作用。我怎样才能让它正常工作?
$ cat test.sh
#!/usr/bin/env sh
echo "Hello $@"
matt@rancher-4mmm /tmp/matt $ chmod +x test.sh
matt@rancher-4mmm /tmp/matt $ sh ./test.sh matt
Hello matt
matt@rancher-4mmm /tmp/matt $ ./test.sh matt
-bash: ./test.sh: Permission denied
matt@rancher-4mmm /tmp/matt $ ls -la
total 4
drwxr-xr-x 2 matt matt 60 Feb 28 20:00 .
drwxrwxrwt 14 root root 280 Feb 28 19:59 ..
-rwxr-xr-x 1 matt matt 35 Feb 28 20:00 test.sh
Container-Optimized OS 使用 "noexec" 标志挂载 file-system 除了 "Among the writable locations, only /var/lib/docker and /var/lib/cloud are mounted as " 可执行”(即没有 noexec 挂载标志)。” [1]。您可以使用以下命令进行验证:
mount | grep noexec
有关 Container-Optimized OS (COS) 文件系统布局的更多信息,请参阅 documentation。 'noexec' 选项不允许在挂载的文件系统上直接执行任何二进制文件。这是因为 COS 上的默认安全性 lock-down 实现。
COS 节点上的大多数文件系统都使用 "noexec" 标志挂载,因此您无法从中执行二进制文件。
一些解决方法:
- 对于脚本,以脚本作为参数调用解释器,"bash /path/script.sh","python /path/app.py"
- 在/mnt/disks下挂载额外的数据盘。您可以在没有 "noexec" 标志的情况下安装它。使用启动脚本在启动时挂载。
如果你想 运行 一个二进制 one-off 并且不想处理另一个 PD,你也可以挂载一个 tmpfs 设备并从那里 运行 它.
sudo mkdir /mnt/disks/scratch
sudo mount -t tmpfs tmpfs /mnt/disks/scratch/
一个解决方案是使用另一个图像系列,例如ubuntu
.
那里,/tmp/
没有安装 noexec
。
在任何其他 linux 发行版上,我可以创建一个带有 shebang 和 运行 shell 脚本的文件,如下所示:
$ chmod +x test.sh
$ ./test.sh Johnny
hello Johnny
但是在 Google Cloud Platform Container-Optimized OS 上,我得到 -bash: ./test.sh: Permission denied
如果我以 sh
作为前缀,例如sh test.sh Johnny
它会起作用。我怎样才能让它正常工作?
$ cat test.sh
#!/usr/bin/env sh
echo "Hello $@"
matt@rancher-4mmm /tmp/matt $ chmod +x test.sh
matt@rancher-4mmm /tmp/matt $ sh ./test.sh matt
Hello matt
matt@rancher-4mmm /tmp/matt $ ./test.sh matt
-bash: ./test.sh: Permission denied
matt@rancher-4mmm /tmp/matt $ ls -la
total 4
drwxr-xr-x 2 matt matt 60 Feb 28 20:00 .
drwxrwxrwt 14 root root 280 Feb 28 19:59 ..
-rwxr-xr-x 1 matt matt 35 Feb 28 20:00 test.sh
Container-Optimized OS 使用 "noexec" 标志挂载 file-system 除了 "Among the writable locations, only /var/lib/docker and /var/lib/cloud are mounted as " 可执行”(即没有 noexec 挂载标志)。” [1]。您可以使用以下命令进行验证:
mount | grep noexec
有关 Container-Optimized OS (COS) 文件系统布局的更多信息,请参阅 documentation。 'noexec' 选项不允许在挂载的文件系统上直接执行任何二进制文件。这是因为 COS 上的默认安全性 lock-down 实现。
COS 节点上的大多数文件系统都使用 "noexec" 标志挂载,因此您无法从中执行二进制文件。
一些解决方法:
- 对于脚本,以脚本作为参数调用解释器,"bash /path/script.sh","python /path/app.py"
- 在/mnt/disks下挂载额外的数据盘。您可以在没有 "noexec" 标志的情况下安装它。使用启动脚本在启动时挂载。
如果你想 运行 一个二进制 one-off 并且不想处理另一个 PD,你也可以挂载一个 tmpfs 设备并从那里 运行 它.
sudo mkdir /mnt/disks/scratch
sudo mount -t tmpfs tmpfs /mnt/disks/scratch/
一个解决方案是使用另一个图像系列,例如ubuntu
.
那里,/tmp/
没有安装 noexec
。