Тома Nginx Docker пусты

При использовании docker-compose nginx не показывает файлы, как другие образы.

Например, с Mysql приведенный ниже код сохранит данные, созданные в /var/lib/mysql, на локальном компьютере в ./volumes/db/data.

./volumes/db/data:/var/lib/mysql

Другой пример, с Wordpress, приведенный ниже код сохранит данные, созданные в /var/www/html/wp-content/uploads, на локальный компьютер в ./volumes/uploads/data.

./volumes/uploads/data:/var/www/html/wp-content/uploads

Однако это не работает с nginx, поэтому независимо от того, на что я меняю /some/nginx/path, он никогда не появляется в ./volumes/nginx/data.

./volumes/nginx/data:/some/nginx/path

Работает ли nginx по-другому в этом отношении?


Обновлять

Использование именованного тома со следующими конфигурациями решило эту проблему:

  • В разделе services файла docker-compose я изменил ./volumes/nginx/data:/some/nginx/path на nginx_data:/some/nginx/path

  • И тогда мой раздел volumes выглядит следующим образом


volumes:
  nginx_data:
    driver: local
    driver_opts:
      o: bind
      device: ${PWD}/volumes/nginx/data

person wfaye    schedule 06.09.2018    source источник


Ответы (2)


Не должно быть никакой разницы, том монтирует локальный каталог в каталог в контейнере. Либо вы монтируете неправильно, либо монтируете неправильный путь внутри контейнера nginx (тот, который nginx не использует).

На основе официальной документации образа докера nginx на https://docs.docker.com/samples/library/nginx/ вы должны смонтировать в /usr/share/nginx/html

$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx

Кроме того, я бы включил полные пути в ваш docker-compose.yaml:

volumes:
  - /full_path/volumes/nginx/data:/usr/share/nginx/html

Если это все еще не работает, вы должны запустить в контейнер и подтвердить, что каталог смонтирован:

$ docker exec -it <container_name> sh
$ df -h | grep nginx

# write data, confirm you see it on the docker host's directory
$ cd /usr/share/nginx/html
$ touch foo

# on docker host
$ ls /full_path/volumes/nginx/data/foo

Если что-то из этого не работает, я бы посмотрел журналы докеров, чтобы увидеть, была ли проблема с подключением каталога, возможно, проблема с путем или разрешением.

$ docker logs <container_name>

--- ОБНОВЛЕНИЕ ---

Я запустил все, что вы используете, и это просто сработало:

$ cat Dockerfile
FROM nginx
RUN touch /usr/share/nginx/html/test1234 && ls /usr/share/nginx/html/


$ docker build -t nginx-image-test .; docker run -p 8889:80 --name some-nginx -v /full_path/test:/usr/share/nginx/html:rw -d nginx-image-test; ls ./test;
...

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
33ccbea6c1c1        nginx-image-test    "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:8889->80/tcp   some-nginx

$ cat test/index.html
hello world

$ curl -i http://localhost:8889
HTTP/1.1 200 OK
Server: nginx/1.15.3
Date: Thu, 06 Sep 2018 15:35:43 GMT
Content-Type: text/html
Content-Length: 12
Last-Modified: Thu, 06 Sep 2018 15:31:11 GMT
Connection: keep-alive
ETag: "5b91483f-c"
Accept-Ranges: bytes

hello world

-- ОБНОВЛЕНИЕ 2 -- Отлично, вы поняли это, этот пост, кажется, объясняет, почему: том данных докера и смонтированный каталог хоста

Каталог хоста по своей природе зависит от хоста. По этой причине вы не можете смонтировать каталог хоста из Dockerfile, потому что встроенные образы должны быть переносимыми. Каталог хоста не будет доступен на всех потенциальных хостах.

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

person d g    schedule 06.09.2018
comment
Спасибо, это помогает решить мой вопрос, но я понимаю, что у меня немного другая проблема, чем та, которую задал мой вопрос. У меня есть данные, которые я хочу разместить в контейнере по адресу /usr/share/nginx/html:rw, но эти данные исчезают при монтировании тома. чтобы снова контрастировать с изображением wordpress, я могу поместить данные в /usr/src/wordpress/, и они появятся в /var/www/html/, когда wordpress смонтирует том. есть ли у nginx аналогичная папка, в которую я могу поместить файлы, чтобы они монтировались в /usr/share/nginx/html? - person wfaye; 06.09.2018
comment
Вы подтвердили, что у вас есть точка монтирования в контейнере и что вы можете писать в нее внутри контейнера и читать на хосте? Следующие шаги по устранению неполадок будут зависеть от того, как все это работает. Также вы используете официальный образ niginx? Я бы просто попробовал запустить докер с вашими томами в качестве параметров и посмотреть, работает ли это, избегая компоновки докеров и любых других внешних вещей. - person d g; 06.09.2018
comment
Да, я могу подтвердить, что точка монтирования доступна для записи на контейнере и для чтения на хосте. Кроме того, да использовать официальный образ nginx. я получаю те же результаты с запуском докера. все это хорошо, но я хочу пойти дальше (но, возможно, это неправильный подход) -- есть определенные файлы, которые загружаются с помощью команды RUN, и как только я подключаюсь к этой папке, файлы исчезают. в версии wordpress я могу загрузить файлы в /usr/src/wordpress, и позже они появятся в /var/www/html, поэтому я хотел сделать то же самое с nginx - person wfaye; 06.09.2018
comment
для этого требуется dockerfile, вот он -- Dockerfile -- ИЗ nginx RUN touch /usr/share/nginx/html/test1234 && ls /usr/share/nginx/html/ -- КОМАНДНАЯ СТРОКА -- docker build -t nginx- образ-тест.; docker run --name some-nginx -v ~/test:/usr/share/nginx/html:rw -d nginx-image-test; лс ~/тест; -- ОБЪЯСНЕНИЕ -- вы заметите, что ~/test пуст, а test1234 там нет. он был смонтирован поверх оригинального /usr/share/nginx/html. с изображением WordPress вы можете поместить test1234 в другое место, чтобы когда /usr/share/nginx/html смонтировался в ~/test, вы увидели test1234 - person wfaye; 06.09.2018
comment
Я просмотрел комментарий, но не вижу, чтобы файл test1234 существовал на вашем хосте. Так что я правильно ожидаю, что test/index.html будет там, но test1234, созданный в файле докеры, отсутствует - person wfaye; 06.09.2018
comment
Давайте продолжим обсуждение в чате. - person d g; 06.09.2018
comment
Я, наконец, решил эту проблему, используя именованные тома, но, возможно, вы можете дать больше информации? Я собираюсь обновить вопрос - person wfaye; 06.09.2018

Я также столкнулся с этой проблемой при попытке создать том для размещения моих собственных конфигураций nginx в файле etc/nginx. Хотя я так и не узнал реальной проблемы, я думаю, что это связано с тем, как nginx создается из Dockerfile.

Я решил проблему, используя свой собственный Dockerfile для расширения оригинала и копирования файлов конфигурации во время сборки. Надеюсь, это поможет.

FROM nginx:1.15.2

COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./global /etc/nginx/global
COPY ./conf.d /etc/nginx/conf.d
person Aaron    schedule 06.09.2018