2017-02-22 11 views
2

Я довольно новичок в докере, и я стараюсь создать изображение для докеры для разных сайтов.Уровень громкости докеры пуст даже от инициализации

Все работает отлично, за исключением моих томов.

Вот Exemple из Докер-композе:

version: '2' 

services: 
    website: 
    build: 
     context: ./dockerfiles/           
     args:                  
      MYSQL_ROOT_PASSWORD: [email protected] 
    volumes: 
     - ./logs:/var/log 
     - ./html:/var/www 
     - ./nginx:/etc/nginx 
     - ./mysql-data:/var/lib/mysql 
    ports: 
     - "8082:80" 
     - "3307:3306" 

Anf вот мой докер файл:

FROM php:5.6-fpm 

ARG MYSQL_ROOT_PASSWORD 

RUN export DEBIAN_FRONTEND=noninteractive; \ 
echo mysql-server mysql-server/root_password password $MYSQL_ROOT_PASSWORD | debconf-set-selections; \ 
echo mysql-server mysql-server/root_password_again password $MYSQL_ROOT_PASSWORD | debconf-set-selections; 

RUN apt-get update && apt-get install -y -q mysql-server php5-mysql nginx wget 

EXPOSE 80 3306 

VOLUME ["/var/www", "/etc/nginx", "/var/lib/mysql", "/var/log"] 

Все работает хорошо, мы ожидаем, что все мои папки пусты в мои объемы хозяевах , Я хочу видеть данные nginx conf и mysl в своих папках.

Что я делаю неправильно?

Благодарим за помощь.

EDIT 1: На самом деле проблема заключается в том, что я хочу Докер-Compose для создания тома в моем каталоге Docker, если он не существует, и использовать этот объем, если он существует, как это объяснить https://stackoverflow.com/a/39181484. но, похоже, это не работает.

+0

Я считаю, что это охватывает ваш случай: [Создать объем докеров с существующими в нем данными] (http://stackoverflow.com/questions/36152081/create-docker-volume-with-preexisting-data-in-it/36152439 # 36152439) – jrbeverly

+1

Возможный дубликат [Создать объем докера с существующими данными в нем] (http://stackoverflow.com/questions/36152081/create-docker-volume-with-preexisting-data-in-it) – jrbeverly

+0

На самом деле проблема заключается в том, что я хочу, чтобы docker-compose создавал том в моем каталоге докеров, если он не существует, и использовать этот том, если он существует, поскольку это объясняется в http://stackoverflow.com/a/39181484. но, похоже, это не работает. – Mayous

ответ

5

Проблема в том, что вы ожидаете, что файлы из Контейнера будут установлены на вашем хосте.

Это не так, как это работает: это наоборот:

Docker монтирует папку хоста в папке контейнера указывается. Если вы заходите в контейнер, вы увидите, что там, где должны были быть файлы init, ничего не будет (или что-то еще в папке вашего хоста), и вы можете записать файл в папку, и это будет отображаться на вашем хосте.

Лучше всего, чтобы получить файлы инициализации и изменить их для вашего контейнера является:

  • Создайте контейнер без монтирования папки (исходные данные контейнера будут там)
  • Run контейнера (контейнер будет иметь файлы в нужном месте от установки Nginx и т.д. ...) docker run <image>
  • Скопируйте файлы из контейнера с docker cp <container>:<container_folder>/* <host_folder>
  • Теперь у вас есть «оригинальные» файлы из контейнера инициализации на хосте ,
  • Измените файлы, необходимые для контейнера.
  • Запустите контейнер, устанавливающий папки хоста с новыми файлами в них.

Примечание: Вы могли бы хотеть пойти внутри контейнера с оболочкой (docker run -it <image> /bin/sh) и застегивать все папки, чтобы убедиться, что у вас есть все, если есть вложенные папки, а затем docker cp ... почтовый файл

Также , будьте осторожны в отношении чувствительности к файловой системе: в файлах Linux файлы чувствительны к регистру. В Mac OS X это не так. Поэтому, если у вас есть Init.conf и init.conf в той же папке, они будут сталкиваться при копировании на хост Mac OS X.

+0

Спасибо за ваш ответ. Я вижу, что если я монтирую том в контейнер без указания чего-либо в компоновке докеры, содержимое каждого тома будет видимым на хосте в «/var/lib/docker/volumes/.../_data», только если объем не существует раньше. Я понимаю, что если я укажу еще один путь для моего тома в хост (как, например, в docker-compose), поведение отличается, даже если папка не существует раньше? – Mayous

+0

Вам не нужно путаться с/var/lib/docker/томами ... потому что это внутренняя часть Docker. Docker будет создавать/удалять эти папки по мере необходимости, поэтому не полагайтесь на это. Docker использует многоуровневую файловую систему, поэтому повторно использует тома, если они определены несколько раз. Опять же, не полагайтесь на внутренние файлы Docker для выполнения своей работы: смонтируйте папку хоста, где она находится в контейнере, и только ожидайте, что там будет показано на контейнере. Если у вас есть файлы в папке с контейнером, они будут доступны, если вы не установите домашнюю папку. – MrE

+0

, если вам нужен оба набора файлов, тогда у вас должен быть ENTRYPOINT, который запустит скрипт и решит загрузить. Затем вы можете спрятать правильную папку/файл, где нужно. – MrE

Смежные вопросы