【问题标题】:Cifs mount in docker container with docker-compose使用 docker-compose 将 Cifs 安装在 docker 容器中
【发布时间】:2020-09-09 23:45:00
【问题描述】:

我想将一个目录挂载到一个 docker-container 中。 由于有解决方案,我尝试了 --privileged 标志并设置所需的功能:

docker-compose.yaml:

version: '2.0'
services:
  mounttest:
    image: test

    privileged: true
    cap_add:
      - SYS_ADMIN
      - DAC_READ_SEARCH
    
    restart: unless-stopped
    container_name: test
    mem_limit: 500m
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/apps/docker-test/

Dockerfile:

FROM ubuntu:18.04

ADD . /apps/docker-test/

# APT-GET
RUN apt-get update && apt-get install -y \
    sudo \
    cifs-utils

# CHMOD SHELL SCRIPTS
RUN chmod 0755 /apps/docker-test/run.sh
RUN chmod 0755 /apps/docker-test/build.sh

RUN /apps/docker-test/build.sh
CMD bash /apps/docker-test/run.sh

build.sh:

mkdir -p /test_folder
echo "Mount"
sudo mount -t cifs -o username=XXX,password=XXX,workgroup=XX //server/adress$ /test_folder

run.sh 启动一个 python 脚本

这不起作用,而是:

docker-compose build

给我错误:

Unable to apply new capability set

我发现的所有解决方案都只提到了设置的特权标志或功能。有人可以帮忙吗?

【问题讨论】:

    标签: docker docker-compose cifs


    【解决方案1】:

    发生此错误是因为您尝试在build 步骤中安装设备。目前,这些功能aren't available for the build container to use 似乎正在以a flag for disabling security at buildkit 的形式推出,而不是在构建时启用自定义功能。

    通常的做法是在开始构建过程时准备好 CIFS 挂载,因为它不会公开任何身份验证、设备或挂载点,而且 docker 更容易处理更改并做出反应它们(因为构建过程会在构建之前努力缓存所有内容)。

    如果您仍想这样做,则需要一些额外的步骤来启用来自 buildkitddocker buildx 的不安全标志:

    请注意,截至今天 (2020-09-09),支持仍处于试验阶段,可能会发生无法预料的后果。

    1. 确保您使用的是 docker 19.03 或更高版本。
    2. 通过将密钥 "experimental":"enabled" 添加到您的 ~/.docker/config.json 来启用实验功能
    3. 创建并使用启用了security.insecure 权利的构建器:
    docker buildx create --driver docker-container --name local \
          --buildkitd-flags '--allow-insecure-entitlement security.insecure' \
          --use
    
    1. 通过在第一行之前添加来更改您的 Dockerfile 以使用实验性语法:
    # syntax = docker/dockerfile:experimental
    
    1. 更改 Dockerfile 指令,使其在没有安全限制的情况下运行代码:
    RUN --security=insecure /apps/docker-test/build.sh
    
    1. 使用 BuildKit 和 --allow security.insecure 标志构建您的 docker 映像:
    docker buildx build --allow security.insecure .
    

    这样您的构建将能够打破安全限制。 我必须重申,这不是推荐的做法,原因如下:

    • 它将公开其他图像的构建步骤以升级该权限漏洞。
    • 构建器无法正确缓存该层,因为它使用了不安全的功能。

    记住这一点,祝安装愉快:)

    【讨论】:

    • 你的意思是,装载应该发生在 docker-container 之外?
    • 是的。请注意,错误是由构建步骤引起的,而不是容器本身。
    • 但是由于将它挂载到容器中会更有用(考虑到,如果我不再需要容器,我不必记得关闭挂载),是否有可能在此过程中以某种方式安装它?
    • 是的,我已经更改了答案以包含一种方法。请记住,它不是 docker-compose 功能,因为它使用 BuildKit 来执行此操作。
    • 非常感谢!我认为您的解决方案非常适合另一个目的,但实际上我找到了一个更适合我的解决方案,我很抱歉..
    【解决方案2】:

    我找到的答案是将mount命令放入run.sh文件中。由于 Dockerfile 中的命令(或 CMD)仅在运行时执行

    docker-compose up
    

    只有在预先完成的构建完成后才会执行挂载。

    因此,在启动python脚本之前,先执行mount命令。 就我而言,这只适用于将特权标志设置为 true 的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多