如何将文件从主机复制到名为volume的docker



我用docker和bind host启动了一个Django应用程序来处理用户上传,但现在我想迁移到命名卷,但我已经在我的主机中有文件,所以我想知道如何将文件从主机复制到卷,这是我的docker-compose为我的web容器:

version: '3'
services:
db:
restart: always
image: "postgres:13.2-alpine"
container_name: db
ports:
- "5432:5432"
env_file:
- ./.env.dev
volumes:
- ./pgdata:/var/lib/postgresql/data
web:
container_name: web
restart: always
build:
context: .
dockerfile: ./docker/development/Dockerfile
environment:
DEBUG: 'true'
DJANGO_SETTINGS_MODULE: myapp.app_settings.development
command: sh ./docker/development/runserver.sh
ports:
- "8000:8000"
env_file:
- ./.env.dev
volumes:
- .:/app # Enable code reload
- django-static:/app/run/static
- django-media:/app/run/media
depends_on:
- db
volumes:
django-static:
django-media:

这是我的Dockerfile:

FROM python:3.8
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
COPY ./requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# COPY . /app
ADD . /app
RUN apt-get clean && apt-get update && apt install -y netcat
COPY ./docker/development/entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

有一种方法可以将我上传的文件从主机:/home/art/myapp/run/media和/home/art/myapp/run/static复制到django-static和django-media卷中

还有,我如何从卷中备份文件?

你可以这样做:

docker run -d --rm --name temp -v django-media:/root alpine tail -f /dev/null
docker cp ./run/media/. temp:/root 
docker stop temp
docker exec -it --user root web /bin/bash
chown -R root:root /run/media

创建挂载命名卷的临时容器

docker run -d --rm --name temp -v django-media:/root alpine tail -f /dev/null

然后将所有文件复制到临时容器卷(./run/media/)。复制所有文件/文件夹到目标目录/root)

docker cp ./run/media/. temp:/root 

则停止临时容器

docker stop temp

现在文件被复制了,但是没有正确的权限,在挂载命名卷的容器内执行终端,移动到目录并运行chown来拥有复制的文件,在这种情况下,我假设容器内的文件属于root:root和复制的文件属于不同的用户,你可以用ls -la命令检查。

docker exec -it --user root web /bin/bash
chown -R root:root /run/media

最新更新