【问题标题】:Why some of the directory in docker container can be mount and share files out and some can not为什么docker容器中有的目录可以挂载共享文件有的不能
【发布时间】:2021-06-11 09:02:55
【问题描述】:

我是 docker 的新手。我在尝试制作自己的 docker 映像时遇到了一个问题。 事情是这样的。我创建了一个新的 DockerFile 来构建我自己的 mysql 映像,我在其中声明了 MYSQL_ROOT_PASSWORD 并将一些初始化脚本放入容器中。 这是我的 Docker

FROM mysql:5.7
MAINTAINER CarbonFace<553127022@qq.com>
ENV TZ                      Asia/Shanghai
ENV MYSQL_ROOT_PASSWORD     Carbon@mysqlRoot7
ENV INIT_DATA_DIR           /initData/sql
ENV INIT_SQL_FILE_0         privileges.sql
ENV INIT_SQL_FILE_1         carbon_user_sql.sql
ENV INIT_SQL_FILE_2         carbonface_sql.sql
COPY ./my.cnf /etc/mysql/donf.d/
RUN mkdir -p $INIT_DATA_DIR
COPY ./sqlscript/$INIT_SQL_FILE_0 $INIT_DATA_DIR/
COPY ./sqlscript/$INIT_SQL_FILE_1 $INIT_DATA_DIR/
COPY ./sqlscript/$INIT_SQL_FILE_2 $INIT_DATA_DIR/
COPY ./sqlscript/$INIT_SQL_FILE_0 /docker-entrypoint-initdb.d/
COPY ./sqlscript/$INIT_SQL_FILE_1 /docker-entrypoint-initdb.d/
COPY ./sqlscript/$INIT_SQL_FILE_2 /docker-entrypoint-initdb.d/
CMD ["mysqld"]

我正在尝试构建一个包含我自己的配置文件的 docker 映像,并且在安装后它会显示在本地目录中并且可以修改。 我真的很困惑,当我用官方描述的这个图像启动我的容器时,还有我的命令:

docker run -dp 3306:3306 \
-v /usr/local/mysql/data:/var/lib/mysql \
-v/usr/local/mysql/conf:/etc/mysql/conf.d \
--name mysql mysql:<my builded tag>

你知道我正在尝试安装 /usr/local/mysql/conf 到容器中的 /etc/mysql/conf.d,这被告知作为自定义配置文件的安装位置。
我认为我的自定义配置文件 my.cnf 在 docker build 期间已复制到映像中,并将显示在我的本地目录中 /usr/local/mysql/conf
因为我已经将我的自定义配置文件复制到了你可以在我的 DockerFile 中看到的图像中。 但原来目录是空的,/etc/mysql/conf.d 也被本地目录覆盖了。
在我运行容器之前,/usr/local/mysql/conf/usr/local/mysql/data 都是空的。
好的,我被告知卷安装目录会覆盖容器内的文件。
但是空的数据目录怎么会显示容器内的数据文件,而空的conf目录会覆盖容器中的conf.d目录。
这没有任何意义。 我很困惑,如果有人能解释为什么会这样,我将不胜感激。

我的操作系统是 MacOS Big Sur,我使用的是最新的 docker。

【问题讨论】:

    标签: docker dockerfile docker-image


    【解决方案1】:

    主机目录绑定挂载,-v /host/path:/container/path总是隐藏图像的内容并将其替换为主机目录。如果宿主目录为空,则容器目录与容器启动时相同的空目录。

    Docker Hub mysql 容器有an involved entrypoint script 检查数据目录是否为空,如果是,则初始化数据库;抽象出来

    #!/bin/sh
    # (actually in hundreds of lines of shell code, with more options)
    if [ ! -d /var/lib/mysql/data/mysql ]; then
      mysql_install_db
      # (...and start a temporary database server and run the
      # /docker-entrypoint-initdb.d scripts)
    fi
    
    # then run the main container command
    exec "$@"
    

    卷的存在不会导致文件被复制(命名卷生命周期中的某个特定点有一个例外),因此如果您需要将内容从容器复制到主机,则需要使用docker cp 手动执行此操作,或者在容器代码中使用方法来执行此操作。

    【讨论】:

    • 显然我是个新手。在过去的几周里,我研究并阅读了许多用于构建 docker 镜像的构建脚本和 Dockerfile。我现在可以理解了,感谢您向我解释。
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2021-04-20
    • 2021-07-04
    • 2015-03-15
    • 2017-02-16
    • 2013-11-13
    相关资源
    最近更新 更多