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

2021-09-08 15:54:37 +08:00
 ragnaroks

操作系统: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 是没有任何问题的,如果不挂载的话也是可以正常运行的,只要一挂载就出事了。

623 次点击
所在节点    问与答
4 条回复
ragnaroks
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
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
2021-09-08 20:48:47 +08:00
ragnaroks
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"]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/800659

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX