Нет прав на создание контейнера с помощью docker-php (нет доступа к docker.sock)

211
04 мая 2018, 11:26

Задача

Необходимо управлять (создавать/удалять/запускать...) контейнерами с помощью docker-php. Сам сервис по управлению должен быть в отдельном контейнере.

Проблема

У контейнера с php-fpm нет прав на использование на смонтированный docker.sock. Каким безопасным способом предоставить контейнеру php-fpm права rw на docker.socket?

Есть сервис в docker-compose, основная его часть приведена ниже. В нем nginx, php-fpm (Dockerfile сборки ниже). В контейнере php-fpm крутится yii2 приложение.

version: '2'
services:
  web:
    image: 'nginx:latest'
    container_name: web
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - './:/shell'
    networks:
      - backend
      - frontend
    restart: always
  php:
    build: ./docker/php/
    container_name: php
    volumes:
      - './:/shell'
      - '/var/run/docker.sock:/var/run/docker.sock'
    environment: []
    networks:
      - backend
    restart: always
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

Когда я пытаюсь создать контейнер, использую docker-php, то получаю ошибку:

Http \ Client \ Socket \ Exception \ ConnectionException - Permission denied

Насколько я понял, то проблема в группах пользователей. Т.е. группа в контейнере php-fpm не может читать/писать из/в docker.sock. Google мне указывал на проблему с группами, в основном эти посты были про jenkins:

  • https://github.com/docker-php/docker-php/issues/222
  • https://github.com/docker-php/docker-php/issues/239
  • https://stackoverflow.com/questions/22135897/access-docker-socket-within-container

Что я имею:

  • Docker version 1.13.1, build 092cba3
  • docker-compose version 1.8.0, build unknown
  • Kubuntu 17.10 x64

Права docker.sock на хосте:

docker:x:134:dmitriy,www-data

Dockerfile для php-fpm:

FROM php:7.1-fpm    
ENV DEBIAN_FRONTEND noninteractive
# PHP
# intl
RUN apt-get update \
    && apt-get install -y libicu-dev \
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl
# xml
RUN apt-get update \
    && apt-get install -y \
    libxml2-dev \
    libxslt-dev \
    && docker-php-ext-install \
        dom \
        xmlrpc \
        xsl
# images
RUN apt-get update \
    && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libgd-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install \
        gd \
        exif
# database
RUN docker-php-ext-install \
    mysqli \
    pdo \
    pdo_mysql
# strings
RUN docker-php-ext-install \
    gettext \
    mbstring
# math
RUN apt-get update \
    && apt-get install -y libgmp-dev \
    && ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h \
    && docker-php-ext-install \
        gmp \
        bcmath
# compression
RUN apt-get update \
    && apt-get install -y \
    libbz2-dev \
    zlib1g-dev \
    && docker-php-ext-install \
        zip \
        bz2
# ftp
RUN apt-get update \
    && apt-get install -y \
    libssl-dev \
    && docker-php-ext-install \
        ftp
# ssh2
RUN apt-get update \
    && apt-get install -y \
    libssh2-1-dev
# memcached
RUN apt-get update \
    && apt-get install -y \
    libmemcached-dev \
    libmemcached11

# others
RUN docker-php-ext-install \
    soap \
    sockets \
    calendar \
    sysvmsg \
    sysvsem \
    sysvshm
# docker.io
RUN groupadd -r -g 999 docker
RUN usermod -aG docker $(whoami)
RUN apt-get update \
    && apt-get install -y \
    docker

В контейнере php-fpm: id

uid=0(root) gid=0(root) groups=0(root),999(docker)

groups

root docker

/etc/group

root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:
floppy:x:25:
tape:x:26:
sudo:x:27:
audio:x:29:
dip:x:30:
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
input:x:101:
systemd-journal:x:102:
systemd-timesync:x:103:
systemd-network:x:104:
systemd-resolve:x:105:
systemd-bus-proxy:x:106:
docker:x:999:root

Код создания контейнера (копипаст из документации):

 $docker= Docker::create();
 $containerConfig = new ContainersCreatePostBody();
 $containerConfig->setImage('nginx:latest');
 $containerConfig->setCmd(['echo', 'I am running a command']);
 $containerCreateResult = $docker->containerCreate($containerConfig);
 var_dump($containerCreateResult);
 exit;

Если я назначу права 777 для docker.sock, то все будет работать, но это "решение" совсем не годится.

READ ALSO
fadeOut по условию. jQuery

fadeOut по условию. jQuery

Всем привет! Подскажите пожалуйстаХочу сделать появление кнопки через fadeIn, и если на неё в течении 3-х секунд не кликнуть, то она исчезнет,...

203
JSTree - не возникает событие open_node

JSTree - не возникает событие open_node

Имеем структуру: пакет-документ-страницаИмеем API, выдающее данные по запросу:

266
JQuery положить в переменную текст из элементов нескольких классов

JQuery положить в переменную текст из элементов нескольких классов

Добрый день всем, прошу вашей помощи ибо сам не могу сделать) Есть несколько дивов, с одинаковыми классами (selected), нужно чтобы в переменную...

225