【问题标题】:cifs permission denied with docker-compose run but not docker-compose execcifs 权限被 docker-compose run 但不是 docker-compose exec 拒绝
【发布时间】:2023-11-25 09:27:01
【问题描述】:

我有一个安装 cifs 共享的脚本。

当我运行docker-compose run www ./myscript 时,mount 返回

mount error(13): Permission denied Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

当我运行docker-compose up -d www && docker-compose exec www ./my-script 时,它可以挂载cifs 共享。

我的 docker-compose.yml 看起来像

version: "3"
services:
  www:
    build:
      context: .
      dockerfile: ./www.dockerfile
    environment:
      - SAMBA_USER
      - SAMBA_PASS
      - SAMBA_PATH
      - SAMBA_MASK
    volumes:
      - ./www:/app
    cap_add:
      - SYS_ADMIN
      - DAC_READ_SEARCH
    tty: true
    stdin_open: true
    command: tail -f /dev/null # hang container so I can exec in

我的 www.dockerfile 看起来像

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN apt install -y cifs-utils
RUN mkdir /app
WORKDIR /app
COPY ./www /app

www/myscript 看起来像

#!/bin/bash
mkdir -p /mnt/data
mount -t cifs -o username=$SAMBA_USER,password=$SAMBA_PASS "$SAMBA_PATH" /mnt/data
ls /mnt/data

Docker 版本 18.03.0-ce,构建 0520e24

docker-compose 版本 1.20.1,构建 5d8c71b

我真的希望 ./myscript 作为 docker-compose 命令运行,但它也返回权限被拒绝。有什么线索吗? TIA

【问题讨论】:

标签: docker docker-compose cifs


【解决方案1】:

就我而言,除了 --cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH 之外,我还必须禁用(最好编写自己的模板)apparmor 模板,因为默认的 docker apparmor 模板具有 deny mount 指令。

例如

docker run -it 
    --cap-add SYS_ADMIN 
    --cap-add DAC_READ_SEARCH 
    --security-opt="apparmor:unconfined" 
    my-container

【讨论】:

    【解决方案2】:

    在我的撰写文件中使用 'privileged: true' 有效,但感觉很糟糕。

    我从https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities 列表中尝试了一堆随机功能,但找不到任何可行的组合(不是系统的)。

    最终决定不使用samba。

    【讨论】: