操作系统: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 是没有任何问题的,如果不挂载的话也是可以正常运行的,只要一挂载就出事了。
1
ragnaroks OP 完整的 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 的数据卷中都立刻就有预期该出现的文件了 |
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 |
3
ragnaroks OP |
4
ragnaroks OP @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"] |