V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ragnaroks
V2EX  ›  问与答

docker EE(WCOW) 的 volume 挂载到容器后,没有将容器内的文件复制到宿主机上,是什么问题?

  •  
  •   ragnaroks · 2021-09-08 15:54:37 +08:00 · 571 次点击
    这是一个创建于 961 天前的主题,其中的信息可能已经有所发展或是发生改变。

    操作系统:windows server 2019 DC
    docker 版本:20.10.6
    docker 存储驱动:windowsfilter

    执行如下命令

    docker volume create nanoserver
    docker run -it -v nanoserver:c:\users\default mcr.microsoft.com/windows/nanoserver:1809
    

    nanoserver 的内容为空,但实际上 c:\users\default 中是有一个 NTUSER.DAT 文件的,而且任意镜像都是如此,挂载哪个路径,那个路径在容器内和宿主机上都直接为空内容。

    发现这个问题是因为没有官方的 mysql 镜像,我就用 debian 的 mysql57 镜像的 Dockerfile 直接改了下底层镜像和 mysql 的二进制包地址,docker build 是没有任何问题的,如果不挂载的话也是可以正常运行的,只要一挂载就出事了。

    4 条回复    2021-09-08 21:03:04 +08:00
    ragnaroks
        1
    ragnaroks  
    OP
       2021-09-08 15:59:48 +08:00
    完整的 Dockerfile 如下

    FROM mcr.microsoft.com/windows/nanoserver:1809
    WORKDIR c:\\app
    USER ContainerAdministrator
    EXPOSE 3306
    COPY bin c:\\app\\bin
    #COPY data c:\\app\\data
    COPY ini.d c:\\app\\ini.d
    COPY share c:\\app\\share
    COPY my.ini c:\\app\\my.ini
    COPY LICENSE c:\\app\\LICENSE
    COPY README c:\\app\\README
    LABEL mysql.archive="https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.34-winx64.zip"
    VOLUME c:\\app\\data
    VOLUME c:\\app\\ini.d
    ENTRYPOINT ["c:\\windows\\system32\\cmd.exe"]
    CMD ["C:\\app\\bin\\mysqld.exe"]

    此 Dockerfile 文件,将底层镜像换成任意 linux 系统,再改下路径,是直接就可以跑起来的,而且 data 和 ini.d 的数据卷中都立刻就有预期该出现的文件了
    ss098
        2
    ss098  
       2021-09-08 17:23:04 +08:00
    https://docs.docker.com/storage/volumes/

    Volume 用法有误,这样挂载一个空的 Volume 至一个不存在的路径。

    对于你的需求,并不需要创建 Volume,正确的写法可以参考:

    https://docs.docker.com/storage/bind-mounts/#start-a-container-with-a-bind-mount
    ragnaroks
        3
    ragnaroks  
    OP
       2021-09-08 20:48:47 +08:00
    ragnaroks
        4
    ragnaroks  
    OP
       2021-09-08 21:03:04 +08:00
    @ss098
    有两份如下 Dockerfile,如果这都是错误使用的话,那第一份总得异常吧,而且我从 docker 18.x 一直用到现在都是这个用法,从未脱离过预期;这次直接暴露的原因是因为以前都是先起容器,在执行 mysqld --initialize,这次突发奇想先初始化,直接把初始化完的原始结构打包进去,这才发现这次的问题

    完全符合预期的 Dockerfile
    FROM debian
    WORKDIR /app
    EXPOSE 3306
    COPY bin /app/bin
    #COPY data /app/data
    COPY ini.d /app/ini.d
    COPY share /app/share
    COPY my.ini /app/my.ini
    COPY LICENSE /app/LICENSE
    COPY README /app/README
    VOLUME /app/data
    VOLUME /app/ini.d
    ENTRYPOINT ["/usr/bin/bash"]
    CMD ["/app/mysqld"]

    完全不符合预期的 Dockerfile
    FROM 请不要在每一个回复中都包括外链,这看起来像是在 spamming/windows/nanoserver:1809
    WORKDIR c:\\app
    USER ContainerAdministrator
    EXPOSE 3306
    COPY bin c:\\app\\bin
    #COPY data c:\\app\\data
    COPY ini.d c:\\app\\ini.d
    COPY share c:\\app\\share
    COPY my.ini c:\\app\\my.ini
    COPY LICENSE c:\\app\\LICENSE
    COPY README c:\\app\\README
    VOLUME c:\\app\\data
    VOLUME c:\\app\\ini.d
    ENTRYPOINT ["c:\\windows\\system32\\cmd.exe"]
    CMD ["C:\\app\\bin\\mysqld.exe"]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2679 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:53 · PVG 12:53 · LAX 21:53 · JFK 00:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.