Как делить пользователей между сервисами в docker-compose? - PullRequest
0 голосов
/ 26 сентября 2019

Как делить пользователей между сервисами в docker-compose?Я могу создать том и смонтировать его в каталоге / etc / container, но он скроет другие файлы / каталоги.Существует ли более разумная идея для достижения цели?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Вы можете использовать volumes + bind mount для монтирования одного контейнера passwd & group в другой контейнер.

Далее приведен пример:

  1. Если не использовать том, просто подтвердите исходное имя пользователя mysql в тестовом сервисе:

    docker_compose.yaml:

    version: "3"
    
    services:
      db:
        image: mysql
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: example
    test:
      image: ubuntu:16.04
      command: id mysql
      depends_on:
        - db
    

    Выполните следующим образом:

    $ docker-compose up
    Creating network "23_default" with the default driver
    Creating 23_db_1 ... done
    Creating 23_test_1 ... done
    Attaching to 23_db_1, 23_test_1
    test_1  | id: 'mysql': no such user
    db_1    | Initializing database
    23_test_1 exited with code 1
    

    Сверху вы можете видеть, что контейнер из ubuntu:16.04 не имеет пользователя mysql, который является пользователем по умолчанию в mysql:

    test_1 |id: 'mysql': такого пользователя нет

  2. Используйте тома, чтобы сделать user mysql видимым для test контейнера:

    docker_compose.yaml:

    version: "3"
    
    services:
      db:
        image: mysql
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: example
        volumes:
          - my_etc:/etc
      test:
        image: ubuntu:16.04
        command: id mysql
        depends_on:
          - db
        volumes:
          - /tmp/etc-data/passwd:/etc/passwd
          - /tmp/etc-data/group:/etc/group
    
    volumes:
      my_etc:
        driver: local
        driver_opts:
          type: 'none'
          o: 'bind'
          device: '/tmp/etc-data'
    

    Выполнить следующим образом, ПРИМЕЧАНИЕ: нам нужно новое /tmp/etc-data до запуска:

    $ mkdir -p /tmp/etc-data
    $ docker-compose up
    Creating network "23_default" with the default driver
    Creating 23_db_1 ... done
    Creating 23_test_1 ... done
    Attaching to 23_db_1, 23_test_1
    db_1    | Initializing database
    test_1  | uid=999(mysql) gid=999(mysql) groups=999(mysql)
    23_test_1 exited with code 0
    

    Сверху вы можете увидетьtest сервис уже может иметь пользователь mysql

    test_1 |uid = 999 (mysql) gid = 999 (mysql) groups = 999 (mysql)

Небольшое объяснение:

вышеВначале используйте решение named volume, чтобы вставить /etc папку first container в папку /tmp/etc-data на хост-компьютере докера, затем второй контейнер будет использовать bind mount для отдельного подключения passwd & group ко второму.контейнер.Как видите, второй контейнер просто монтирует 2 файла (passwd, group), поэтому он не будет скрывать другие файлы.

0 голосов
/ 26 сентября 2019

Вы можете монтировать только файл в контейнере Docker.

volumes:
    - /etc/mysql.cnf:/etc/mysql.cnf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...