Docker 保留数据,但每隔 "run" 从主机文件夹创建一个新卷
Docker keeps data but creates a new volume from host folder every "run"
这似乎是我对卷的误解。我有一个包含两个服务的 docker-compose 文件:jobs
是一个 Flask api,它是从 Dockerfile(见下文)构建的,mongo
来自官方 MongoDb 图片。
我有两个卷:- .:/code
从我的主机工作目录链接到容器中的 /code
文件夹,以及一个命名卷 mongodata
。
version: "3"
services:
jobs:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: ${FLASK_ENV}
FLASK_APP: ${FLASK_APP}
depends_on:
- mongo
mongo:
image: "mongo:3.6.21-xenial"
restart: "always"
ports:
- "27017:27017"
volumes:
- mongodata:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
volumes:
mongodata:
jobs
服务的 Dockerfile :
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=job-checker
ENV FLASK_ENV=development
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run", "--host=0.0.0.0"]
每次我删除这些容器并重新 运行 时,一切都很好,我的数据仍然在 mongodata
卷中。但是当我检查卷列表时,我可以看到一个新卷是从 - .:/code
创建的,卷名很长,例如:
$ docker volume ls
DRIVER VOLUME NAME
local 55c08cd008a1ed1af8345cef01247cbbb29a0fca9385f78859607c2a751a0053
local abe9fd0c415ccf7bf8c77346f31c146e0c1feeac58b3e0e242488a155f6a3927
local job-checker_mongodata
在这里我 运行 docker-compose up
,然后我删除了容器,然后 运行 再次启动,所以我的工作文件夹中有两个卷。
每次创建一个新卷而不是使用前一个卷是否正常?
谢谢
隐藏在 Docker Hub mongo
image 文档末尾的注释是:
This image also defines a volume for /data/configdb
...
图像的 Docker 文件又包含 line
VOLUME /data/db /data/configdb
当您启动容器时,您会在 /data/db
上安装您自己的卷,但不会在第二条路径上安装任何东西。这会导致 Docker 在那里创建一个匿名卷,这是您看到的只有一个长十六进制 ID 的卷。
删除额外的卷应该是安全的,尤其是当您确定它们没有附加到容器并且它们没有有趣的内容时。
此行为与其他容器中的绑定挂载无关;绑定安装根本不会出现在 docker volume ls
列表中。
这似乎是我对卷的误解。我有一个包含两个服务的 docker-compose 文件:jobs
是一个 Flask api,它是从 Dockerfile(见下文)构建的,mongo
来自官方 MongoDb 图片。
我有两个卷:- .:/code
从我的主机工作目录链接到容器中的 /code
文件夹,以及一个命名卷 mongodata
。
version: "3"
services:
jobs:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: ${FLASK_ENV}
FLASK_APP: ${FLASK_APP}
depends_on:
- mongo
mongo:
image: "mongo:3.6.21-xenial"
restart: "always"
ports:
- "27017:27017"
volumes:
- mongodata:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
volumes:
mongodata:
jobs
服务的 Dockerfile :
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=job-checker
ENV FLASK_ENV=development
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run", "--host=0.0.0.0"]
每次我删除这些容器并重新 运行 时,一切都很好,我的数据仍然在 mongodata
卷中。但是当我检查卷列表时,我可以看到一个新卷是从 - .:/code
创建的,卷名很长,例如:
$ docker volume ls
DRIVER VOLUME NAME
local 55c08cd008a1ed1af8345cef01247cbbb29a0fca9385f78859607c2a751a0053
local abe9fd0c415ccf7bf8c77346f31c146e0c1feeac58b3e0e242488a155f6a3927
local job-checker_mongodata
在这里我 运行 docker-compose up
,然后我删除了容器,然后 运行 再次启动,所以我的工作文件夹中有两个卷。
每次创建一个新卷而不是使用前一个卷是否正常?
谢谢
隐藏在 Docker Hub mongo
image 文档末尾的注释是:
This image also defines a volume for
/data/configdb
...
图像的 Docker 文件又包含 line
VOLUME /data/db /data/configdb
当您启动容器时,您会在 /data/db
上安装您自己的卷,但不会在第二条路径上安装任何东西。这会导致 Docker 在那里创建一个匿名卷,这是您看到的只有一个长十六进制 ID 的卷。
删除额外的卷应该是安全的,尤其是当您确定它们没有附加到容器并且它们没有有趣的内容时。
此行为与其他容器中的绑定挂载无关;绑定安装根本不会出现在 docker volume ls
列表中。