【问题标题】:Create Dockerfile and mount azure file share on linux image在 linux 映像上创建 Dockerfile 并挂载 azure 文件共享
【发布时间】:2019-12-23 13:34:59
【问题描述】:

我正在尝试关注Mount Azure File storage on Linux VMs using SMB,它展示了如何在 Linux VM 中的文件夹上挂载 azure 文件。唯一的区别是,我正在尝试将共享挂载到使用 Dockerfile 创建的 Linux 容器上。

虽然面临几个问题,但我理解需要以“特权”模式运行容器以允许我运行挂载命令。但是到目前为止我一直没有成功,并且我找不到 docker 文件的引用做这样的事情。

我正在尝试在 Docker 文件中运行此命令。

RUN -it --privileged  mount -t cifs filesharepath mountpath  -o vers=3.0,username=username,password=password,dir_mode=0777,file_mode=0777,serverino

但是,我不断收到诸如非法字符-t 之类的错误,它不会导致任何地方。

所以第一个问题是,是否有可能从 Docker File 实现这样的目标?如果有,有哪些可能性?

更新:

挂载的目的特别是将drupa文件存储目录挂载到天蓝色文件共享。例如: var/sites/default/files 到 azure 文件存储。这可能需要已针对特定于 drupal 的实现完成的解决方案。如果有人有想法,那将有所帮助!

【问题讨论】:

  • 你为什么不简单地使用一个卷? docs.microsoft.com/en-us/azure/container-instances/…
  • 这个命令在 dockerfile 中没有任何意义,这个命令作为docker run 的一部分可能有意义吗?
  • @CSharpRocks 因为我想将文件共享用作 drupal 网站的网络文件共享,并且从网站上传的文件需要进入文件共享(挂载在 drupal 文件目录中)。我也不确定这在页面上意味着什么。 “请注意,如果您将共享挂载到存在文件或目录的容器目录中,这些文件或目录会被挂载遮盖,并且在容器运行时无法访问。”我想在容器内的文件夹上挂载一个卷。

标签: linux azure docker drupal


【解决方案1】:

感觉我们需要在这里澄清一些事情:

  • Dockerfile 是放置所有设置说明的地方。就像你想要一台基于 ubuntu 的 linux 机器加上安装几个包。然后 Dockerfile 就是配置它的地方。它还允许配置暴露的端口和默认启动的东西。时期。将外部卷挂载到容器内部的东西上——在 Dockerfile 中没有任何意义,因为它不知道主机系统,也不应该这样做。

  • 拥有 Dockerfile 后,您可以通过执行 docker build .... 构建本地 docker 映像。因此,只有在找不到需要运行的公共映像时才需要 Dockerfile。

  • 一旦有了要运行的映像,您就可以在主机操作系统上使用 --mount source=myvol2,target=/app 选项执行 docker run 以将主机文件夹映射到容器内部文件夹。

总结一下:

  • --mount 命令可以在 docker run 命令期间定义(从镜像启动容器的基本和简单的方法),
  • 如果您正在使用 docker compose,或者在 docker-compose 文件中(通常是开发环境,让多个容器在一个地方运行并配置配置)。
  • 如果您要使用 kubernetes,或者在部署 yaml 文件中(通常用于生产,您需要自动运行)。

【讨论】:

    【解决方案2】:

    我将通过 docker 卷来执行此操作。使用卷比损害容器的安全性更实用。可以使用命令行或通过 docker compose 创建卷。

    通过命令行创建一个 docker 卷

    docker volume create \
    --driver local \
    --opt type=cifs \
    --opt device=//MyStorageAccount.file.core.windows.net/myFileShare \
    --opt o=addr=MyStorageAccount.file.core.windows.net,username=MyStorageAccount,password=*****==,file_mode=0777,dir_mode=0777 \
    --name MyVolume
    

    然后在创建容器时挂载它。

    docker run -d  --name MyContainer  --mount source=MyVolume,target=/app  nginx:latest
    

    您也可以在撰写文件中使用音量

    version: "3"
    services:
      rabbitmq:
        image: nginx:latest
        restart: always
        volumes:
          - MyVolume:/app
    volumes:
      MyVolume:
        external: true
    

    您可以在 docker-compose 中创建卷。请更新密码字段或使用变量

    version: "3"
    services:
      rabbitmq:
        image: nginx:1.16.0
        restart: always
        volumes:
          - MyVolume:/app
    volumes:
      MyVolume:
        driver: local
        driver_opts:
          type: "cifs"
          o: "mfsymlinks,vers=3.0,username=MyStorageAccount,password=******==,addr=MyStorageAccount.file.core.windows.net"
          device: "//MyStorageAccount.file.core.windows.net/myFileShare"
    

    【讨论】:

    • 在 Windows 上运行 docker volume create 命令 yields:来自守护进程的错误响应:create devshare:此平台不支持选项
    • 我今天在带有 Docker 桌面 4.0.1 的 windows 10 pro 中尝试了 docker volume create 命令并且没有任何问题。
    • 您是否为该命令提供了任何驱动程序选项? docker volume create 对我来说是独立工作的,但是一旦我提供其他选项,我就会收到错误消息。您需要提供附加选项才能使用 cifs。
    • 是的,我尝试了与答案中完全相同的命令,其中包含附加 cifs 卷所需的所有选项。在 CMD 中,多行命令需要使用 '^' 而不是 '\'。
    • 我已经意识到我的误解。我正在尝试使用 Windows 容器!仅 Windows 容器 Linux 容器不支持驱动程序选项。很抱歉造成混乱。
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2020-08-21
    • 2021-09-22
    • 2021-08-15
    • 2022-10-06
    • 2020-08-23
    相关资源
    最近更新 更多