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,如果那是你的未来;如果图像内容更新,体积不会改变。在启动时明确写出设置代码将使你的行为更可预测。)
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,如果那是你的未来;如果图像内容更新,体积不会改变。在启动时明确写出设置代码将使你的行为更可预测。)