docker - 启动容器进程导致“exec:\”/tmp/installer.sh\“:权限被拒绝”
问题描述
我有一个基本映像(名为@release_docker//image
),我正在尝试在其上安装一些 apt 包(以及我构建的二进制文件)。这是它的样子:
load("@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs")
load("@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs")
download_pkgs(
name = "downloaded-packages",
image_tar = "@release_docker//image",
packages = [
"numactl",
"pciutils",
"python",
],
)
install_pkgs(
name = "installed-packages",
image_tar = "@release_docker//image",
installables_tar = ":downloaded-packages.tar",
output_image_name = "release_docker_with_packages"
)
cc_image(
name = "my-image",
base = ":installed-packages",
binary = ":built-binary",
)
但是在构建 docker(运行构建命令的 docker 映像)内部,当我运行时bazel build :my-image --action_env DOCKER_HOST=tcp://192.168.1.2:2375
,它会出错:
+ DOCKER=/usr/bin/docker
+ [[ -z /usr/bin/docker ]]
+ TO_JSON_TOOL=bazel-out/host/bin/external/io_bazel_rules_docker/docker/util/to_json
+ source external/io_bazel_rules_docker/docker/util/image_util.sh
++ bazel-out/host/bin/external/io_bazel_rules_docker/contrib/extract_image_id bazel-out/k8-fastbuild/bin/external/release_docker/image/image.tar
+ image_id=b55375fc9c651e1eff0428490d01b4883de0fca62b5b18e8ede9f3d812b3fc10
+ /usr/bin/docker load -i bazel-out/k8-fastbuild/bin/external/release_docker/image/image.tar
+++ pwd
+++ pwd
++ /usr/bin/docker run -d -v /opt/bazel-root-directory/...[path-to].../downloaded-packages.tar:/tmp/bazel-out/k8-fastbuild/bin/marzban/downloaded-packages.tar -v /opt/bazel-root-directory/...[path-to].../installed-packages.install:/tmp/installer.sh --privileged b55375fc9c651e1eff0428490d01b4883de0fca62b5b18e8ede9f3d812b3fc10 /tmp/installer.sh
/usr/bin/docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/tmp/installer.sh\": permission denied": unknown.
+ cid=ce62e444aefe1f32a20575750a6ee1cc9c2f79d46f2f60187a8bc23f87b5aa25
解决方案
我遇到了同样的问题,我花了一些时间才找到真正的原因。
正如您猜想的那样,您的rules_docker
repo 版本中有一个错误。实际问题是假设本地文件夹可以直接挂载到目标映像中。显然,在 DIND(Docker-In-Docker)的情况下,假设失败了。
幸运的是,作为 install_pkgs 的一部分,此错误已被修复,它使用命名卷与 DIND 一起工作。正如标题所示,解决方案是使用命名卷而不是 short -v src:dst
。
因此,解决方案是升级到 v0.13.0 或更高版本。
rules_docker$ git tag --contains 32f12766248bef88358fc1646a3e0a66efd0e502 | head -1
v0.13.0
推荐阅读
- snowflake-cloud-data-platform - 如何将 Snowflake 会话参数读入变量?
- c - 为什么 sprintf 不想填充我的缓冲区?
- arrays - Fortran 解除分配和数组形状
- python - 如何使用 ax.legend() 为条形图的子图添加公共图例
- nlp - amazon Lex 或 google dialogflow 上不支持的语言的解决方案
- javascript - TextField上出现错误帮助文本时如何更改边框颜色?
- go - 在开发/测试环境中使用 cloud.google.com/go/logging 时,有没有办法禁用日志转发到 GCP?
- python - 如何区分()具有混合值的时间序列数据
- laravel - 在下一个计费周期交换订阅 Laravel Cashier
- r - 重命名数据框列表中的第一个列名以匹配数据框的名称