在Docker容器

时间:2017-11-10 02:11:18

标签: postgresql docker docker-compose docker-volume

我使用Docker Compose运行多个容器,包括一个带有Postgres图像的容器。我正在尝试向该容器添加一个卷,以便在容器构建中保留我的数据。但是,当我尝试在容器中为此卷创建目录时,我收到错误。

我跑:

docker-compose build

然后

docker-compose up

我收到以下错误:

错误:对于cxbenchmark_db_1无法启动服务db:oci运行时错误:container_linux.go:265:启动容器进程导致“process_linux.go:368:容器init导致”rootfs_linux.go:57:mount \\“/ var / lib目录/泊坞窗/卷/ 69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e / _data \\ “来根文件系统\\ ”的/ var / lib中/泊坞窗/ overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 /合并\\“ 在\\” 的/ var / lib中/泊坞窗/ overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 /合并/ var / lib / postgresql / data \\“cause \\”mkdir / var / lib / docker / overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 / merged / var / lib / postgresql / data:permission denied \\“\”“

我的完整docker-compose.yml看起来像这样(请注意定义卷的db服务):

version: '3'  

services:  
  nginx:
    image: nginx:latest
    ports:
      - 80:8000
    volumes:
      - ./src:/src
      - ./config/nginx:/etc/nginx/conf.d
      - ./src/static:/static
    depends_on:
      - web

  web:
    build: .
    command: bash -c "python manage.py makemigrations && python manage.py migrate && gunicorn cx_benchmark.wsgi -b 0.0.0.0:8000"
    depends_on:
      - db
    volumes:
      - ./src:/src
      - ./src/static:/static
    expose:
      - 8000

  db:
    image: postgres:latest
    volumes:
      - /private/var/lib/postgresql:/var/lib/postgresql
    ports:
      - 5432:5432

有关如何解决的任何想法?

2 个答案:

答案 0 :(得分:3)

您看到的错误(必然)是compose文件中显式卷装入挂载的问题,而不是主postgres official Docker image Dockerfile中的VOLUME声明:< / p>

VOLUME /var/lib/postgresql/data

由于您没有为此目录(而是父目录)提供挂载点,因此docker引擎正在创建本地卷,然后尝试将该卷挂载到已绑定的挂载位置并获取权限错误

为清楚起见,这是docker引擎为您创建的卷:

/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data

这是它尝试绑定mount的目录位置dir;在/private/var/lib/postgresql

的绑定挂载之上
mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied

现在,我认为失败的原因是你可能在Docker引擎中打开了用户命名空间(“userns-remap”标志/设置),这样容器就没有创建目录的权限在您主机上的root拥有位置。除此之外,唯一的另一个选择是postgres容器以非root用户身份启动,但我没有在您的撰写文件或官方Dockerfile中看到任何使用的最新版本USER指令。

顺便说一句,由于您的绑定装置与postgres VOLUME中的Dockerfile说明符不匹配,因此您最终会出现双卷,因此可以将您的撰写文件更改为装载到{ {1}}并绕过正在创建的额外卷。特别是如果您希望自己的数据库数据以/var/lib/postgresql/data结尾,因为可能会发现它不存在,而是位于/private/var/lib/postgresql位置。

答案 1 :(得分:0)

基于https://github.com/docker/compose/issues/4039,常见的修复方法是:

  • 重新启动docker服务
  • 运行docker-compose as sudo

我能够做到这一点:

  • sudo mkdir /private/lib/postgresql

  • docker-compose up

使用以下docker-compose.yml:

version: '3'  

services:  
  nginx:
    image: nginx:latest
    ports:
      - 80:8000
  db:
    image: postgres:latest
    volumes:
      - /private/var/lib/postgresql:/var/lib/postgresql
    ports:
      - 5432:5432

对不起,我没有更多的帮助!