Получение ошибки от docker -составить, что пользователь должен владеть каталогом данных - PullRequest
0 голосов
/ 04 марта 2020

Каждый раз, когда я пытаюсь создать свой образ, я получаю следующую ошибку:

Сервер должен запускаться пользователем, которому принадлежит каталог данных.

Ниже приведен мой docker файл:

version: "3.7"

services:
  db:
    image: postgres
    container_name: xxxxxxxxxxxx
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: $POSTGRES_DB
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: $POSTGRES_PASSWORD

  nginx:
    image: nginx:latest
    restart: always
    container_name: xxxxxxxxxxxx-nginx
    volumes:
      - ./deployment/nginx:/etc/nginx
    logging:
      driver: none
    depends_on: ["radio"]
    ports:
      - 8080:80
      - 8081:443

  radio:
    build:
      context: .
      dockerfile: "./deployment/Dockerfile"
    image: test-radio
    command: './manage.py runserver 0:3000'
    container_name: xxxxxxxxxxxxxxx
    restart: always
    depends_on: ["db"]
    volumes:
      - type: bind
        source: ./api
        target: /app/api
      - type: bind
        source: ./xxxxxx
        target: /app/xxxxx
    environment:
      POSTGRES_DB: $POSTGRES_DB
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: $POSTGRES_PASSWORD
      POSTGRES_HOST: $POSTGRES_HOST
      AWS_KEY_ID: $AWS_KEY_ID
      AWS_ACCESS_KEY: $AWS_ACCESS_KEY
      AWS_S3_BUCKET_NAME: $AWS_S3_BUCKET_NAME

networks:
  default:

Изображение построено со следующим запуском. sh file:

 #!/usr/bin/env sh

if [ ! -f .pass ]; then
    openssl rand -base64 32 > .pass
fi

#export POSTGRES_DB="xxxxxxxxxxxxxxxxx"
#export POSTGRES_USER="xxxxxxxxxxxxxx"
#export POSTGRES_PASSWORD="xxxxxxxxxxxxxxxxxxxx"
#export POSTGRES_HOST="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

export POSTGRES_DB="xxxxxxxxxxxxxxxxxx"
export POSTGRES_USER="xxxxxxxxxxxxxxxxxxxx"
export POSTGRES_PASSWORD="`cat .pass`"
export POSTGRES_HOST="db"

export AWS_KEY_ID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export AWS_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxx"
export AWS_S3_BUCKET_NAME=""

echo "Your psql password is in .pass do not commit this file."
echo "The app will be available on localhost:8080 shortly"

if [ -z "$1" ]; then
    docker-compose up
else
    docker-compose up $1
fi

Мне интересно, происходит ли моя ошибка вызван попыткой использования сценария bash для развертывания службы на компьютере Windows?

1 Ответ

1 голос
/ 04 марта 2020

Подробности по проблеме

Поведение, наблюдаемое OP, определенно происходит из-за несоответствия UID / GID, учитывая, что спецификация

volumes:
  - ./postgres-data:/var/lib/postgresql/data

(которую можно рассматривать как docker -создать эквивалент docker run -v "$PWD/postgres-data:/var/lib/postgresql/data" …) bind-mounts папка $PWD/postgres-data внутри контейнера, предоставляя доступ к его файлам как есть (включая метаданные владельца / группы).

Также, обратите внимание, что обработка метаданных владельца / группы между хостом и контейнерами основана только на цифрах c UID и GID , а не на именах владельцев и групп.

Для получения дополнительной информации о UID и GID в контексте Docker, см. также , что статья на Medium.

Обходные пути, если необходимо связывание,

Для полноты, несколько возможных решений обходного пути проблема несоответствия UID-привязки (включая самую простую проблему, которая заключается в изменении UID файлов :), описана в этом ответе на StackOverflow: Как заставить хост и контейнер читать / записывать те же файлы с Docker?

Другие решения

После комментария @ ParanoidPenguin вы можете использовать именованный том, который в основном состоит из:

Примечания:

  • docker run -v PATH1:PATH2 … запускает привязку из PATH1 (хост) в PATH2 (контейнер), если и только если PATH1 является абсолютным (то есть начинается с /) (например, -v "$PWD:$PWD" является общей идиомой)
  • docker run -v NAME:PATH2 … монтирует объем NAME до PATH2 (контейнер) тогда и только тогда, когда NAME не содержит / (то есть соответствует регулярному выражению [a-zA-Z0-9][a-zA-Z0-9_.-]).
  • , даже если мы не запускаем docker volume create foo заранее, docker run -v foo:/data --rm -it debian создаст именованный том foo при необходимости.
  • для заполнения файлов именованного тома (или, соответственно, их резервного копирования) вы можете использовать эфемерный контейнер изображения debian, ubuntu или около того, сочетая одновременно крепление и монтирование тома:

    Добавление файла /home/user/bar.txt в новый том foo

    file1=/home/user/bar.txt  # initial file
    uid=2000  # target User-ID in the volume
    gid=2000  # target Group-ID in the volume
    docker pull debian
    docker run -v "$file1:$file1:ro" -v foo:/data \
      -e file1="$file1" -e uid="$uid" -e gid="$gid" \
      --rm -it debian bash -exc \
      'cp -v -- "$file1" /data/bar.txt && chown -v $uid:$gid /data/bar.txt'
    docker volume ls
    

    Резервное копирование тома foo в архиве

    date=$(date +'%Y%m%d_%H%M%S')
    back="backup_$date.tar.gz"
    destdir=/home/user/backup
    mkdir -p "$destdir"
    docker run -v foo:/data -v "$destdir:/backup" -e back="$back" \
      --rm -it debian bash -exc 'tar cvzf "/backup/$back" /data'
    
...