docker-compose 子文件夹没有出现在卷文件夹中

docker-compose subfolders doesn't appear in volume folder

Docker 文件:

FROM golang:latest
RUN mkdir /app/
RUN mkdir /app/subfolder1
RUN mkdir /app/subfolder2
VOLUME /app/

docker-compose.yml

version: '3.3'
services:
  my_test:
    build: .
    volumes:
      - ./app:/app

我看了(在 mysql Dockerfile 中)数据库 mysql 文件是如何共享的,我决定也这样做。我预计第一次启动docker-compose up,会在/app文件夹中创建两个来自外部的子文件夹。但是在运行docker-compose up中,只创建了一个文件夹/app,里面没有子文件夹。我做错了什么?

请告诉我如何才能实现与 MySQL 容器相同的行为,当第一次启动时我的外部文件夹中充满了文件和文件夹,然后才被使用:

version: '3'
services:
   mysql:
     image: mysql:5.7
     volumes:
        - ./data/db:/var/lib/mysql

以上示例有效,但我的第一个示例无效

docker-compose.yml语句volumes: - ./app:/app将主机的./app目录挂载到容器覆盖您创建的目录结构/app/[subfolder?] 在容器镜像中。

如果您从 docker-compose.yml 文件和 运行 docker-compose up 中删除 volumes 块,您应该能够访问您在图像中创建的结构(即 /app/[subfolder?])

mysql 图像有一个执行首次设置的 involved entrypoint script。那专门检查数据目录是否存在:

if [ -d "$DATADIR/mysql" ]; then
    DATABASE_ALREADY_EXISTS='true'
fi
if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
    docker_init_database_dir "$@"
    ...
fi

请注意,这不依赖于任何内置 Docker 功能,也不会从原始图像中复制任何内容; 运行 填充初始数据库设置、配置用户和 运行 /docker-entrypoint-initdb.d 目录中的内容是一个相当复杂的步骤序列。

如果您想将某种种子数据复制到已安装的卷中,您的容器通常需要自行处理。您可以编写如下入口点脚本:

#!/bin/sh

# If the data directory doesn't have content, copy it
if ! [ -d /data/content ]; then
  cp -a /app/data/content /data
fi

# Run whatever the container's main command is
exec "$@"

(有一种情况 Docker 会从图像内容填充命名卷。这有一些严重的限制:它只适用于命名卷,而不适用于绑定安装的主机目录;它不适用于Kubernetes,如果那是你的未来;如果图像内容更新,体积不会改变。在启动时明确写出设置代码将使你的行为更可预测。)