Docker создает сопоставление локального каталога с томом Dockerfile - PullRequest
0 голосов
/ 06 декабря 2018

Я использую настройку Apache / MySql Docker-compose, и все это хорошо.Однако проблема возникает, когда, поскольку это для локальной разработки, веб-контейнер указывает на локальную папку, для которой мне нужно, чтобы у Apache были разрешения.

Использование

RUN mkdir /www \
&& chown -R apache:apache /www

VOLUME ["/www"]

хорошоесли я запускаю докер-файл Apache самостоятельно или запускаю его в docker-compose без указания тома.Но это означает, что я не могу указать этот том на локальный каталог, в этом сценарии «www» существует внутри контейнера, но не отображается на хост-машину.Если я указываю том внутри файла docker-compose, он отображается в соответствии с ожиданиями, но не позволяет мне просматривать папку / файлы (даже если я выполняю их в контейнере)

Ниже приведено подтверждение концепции,Я работаю в Windows 10 / Docker Desktop Community версии 2.0.0.0-win81 (29211)

EDIT (прокомментировал выставление порта, собрал файл docker из docker-compose и изменил порт с 80 на 81)

РЕДАКТИРОВАТЬ (я обновил следующие файлы, см. Внизу, я оставляю их для потомков)

docker-compose.yml

version: '3.2'
services:
  web:
    restart: always
    build:
      context: .
    ports:
      - 80:80
    volumes: 
    - ./:/www

Dockerfile

FROM centos:centos6 as stage1

RUN yum -y update && yum clean all \
    && yum --setopt=tsflags=nodocs install -y yum-utils \
    httpd \
    php

FROM stage1 as stage2
RUN mkdir /www \
    && chown -R apache:apache /www 

#VOLUME ["/www"]

#EXPOSE 80
ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

ОБНОВЛЕНО Доказательство файлов концепции

Docker-compose.yml

version: '3.2'
services:
  web:
    build:
      context: .
    ports:
      - 80:80
    volumes: 
    - ./:/www

Dockerfile

FROM centos:centos6

RUN yum -y update && yum clean all \
    && yum --setopt=tsflags=nodocs install -y yum-utils \
    httpd \
    php

COPY ./entrypoint.sh /

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

#!/bin/bash
set -e #exit straight away if there's an issue

chown -R apache:apache /www

# Apache
/usr/sbin/httpd -D FOREGROUND

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Docker для Windows использует сетевой файловый ресурс CIFS / Samba для привязки и монтирования файлов хоста в работающий Docker виртуальной машины Linux.Это всегда делается как root:root, так что все файлы / каталоги для bind-mount всегда будут показывать это, если смотреть изнутри контейнера.Это известное ограничение способа, которым Docker разделяет эти файлы между .

Обходные пути ОС:

  1. Во многих случаях это не проблема.Файлы хоста передаются в общедоступный контейнер, поэтому разработка локального приложения во время работы в контейнере в порядке.Для файлов кэша, пользовательских загрузок и т. Д. Просто убедитесь, что они записаны в путь к контейнеру, который не относится к монтированию host-bind, поэтому они остаются в Linux, где вы можете контролировать права доступа.
  2. При необходимоститолько для разработки, запустите приложение в контейнере от имени пользователя root, если ему нужны разрешения на запись для файлов операционной системы.Вы можете переопределить это во время выполнения: например, docker run -u root или user:root в docker-compose.yml
  3. Для работы с файлами базы данных, не монтируйте их с привязкой, а используйте именованные тома для сохранения файлов в LinuxVM.Вы всегда можете использовать docker cp для копирования файлов в тома и из них для быстрого резервного копирования.
0 голосов
/ 06 декабря 2018

Вы используете

RUN mkdir /www \ && chown -R apache:apache /www

До того, как docker-compose отобразит локальный каталог . на www.

Вам необходимо создатьфайл entrypoint.sh или аналогичный.Дай это шбан.И внутри этого вы должны запустить chown -R apache:apache /www.Вам не нужен mkdir, так как он создан docker compose volume config ./:/www.

После этой команды в файле entrypoint.sh вы должны добавить то, что у вас есть для вашей точки входа /usr/sbin/httpd -D FOREGROUND.

Тогда, наконец, вам, конечно, нужно установить новую точку входа для использования файла entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]

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