【问题标题】:How to copy files from host to docker named volume如何将文件从主机复制到docker命名卷
【发布时间】:2021-08-14 01:40:02
【问题描述】:

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

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 cp 将文件从您的主机复制到安装在容器内的命名卷。您也可以在另一个方向使用docker cp,将文件从容器中复制到主机。
  • 谢谢,但是你能给我一个配置的例子吗?请

标签: django docker


【解决方案1】:

你可以这样做:

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

【讨论】:

    猜你喜欢
    • 2016-05-26
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2018-03-18
    • 2014-10-07
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多