Доступ к объему dockerfile из контейнера compose - PullRequest
0 голосов
/ 08 марта 2019

Я новичок в Docker и пытаюсь добиться следующего, но не могу заставить его работать.

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

Для этого сначала я создал файл Docker с такой информацией:

FROM alpine
WORKDIR /usr/local/apache2/htdocs
ADD static /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs

Затем я создалобраз из этого dockerfile, выполняющий следующую команду:

docker build -t customimage .

Затем в моем docker-compose.yaml я запускаю две службы, подобные этой:

version: '3.7'
services:
    custom:
        image: customimage:latest
        tty: true
    apache:
        image: httpd:latest
        volumes:
            - /usr/local/apache2/htdocs
        ports: 
            - "80:80"

После выполнения docker-compose обеслужбы запускаются, но я не могу получить доступ к тому из customimage из контейнера apache.

Что мне здесь не хватает?Я знаю, что могу использовать команды запуска, но я предпочитаю использовать docker-compose, так как в будущем буду добавлять больше сервисов.

1 Ответ

1 голос
/ 08 марта 2019

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

Одна очень важная деталь, которую следует здесь учитывать, - файлы тома не будут видны в контейнере монтирования, если вы привязываете его к месту в файловой системе контейнера, где другие файлы уже существуют. Это должно быть пустое место!

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

Решение

Я предлагаю такой макет проекта:

/
├─ data.Dockerfile
├─ docker-compose.yml
├─ httpd.Dockerfile
├─ index.html 

Это пример минимального веб-сайта, работающего в контейнере httpd, который обслуживаетсайт с тома, смонтированного с хоста.Том, также смонтированный в дополнительном «контейнере данных», который предварительно заполняется веб-сайтом (один файл index.html, для краткости)

Ниже приводится содержимое файлов.:

data.Dockerfile

FROM alpine

# declare a volume at location /var/shared_volume
VOLUME /var/shared_volume
# copy your new great site into the volume location
COPY index.html /var/shared_volume/

# configure an entrypoint that does not terminate, to keep the container up
ENTRYPOINT [ "tail", "-f", "/dev/null" ]

httpd.Dockerfile

FROM httpd:latest

# remove any file and directory at the location where we wantt serve 
# the static content 
RUN rm -rf /usr/local/apache2/htdocs/*

# declare the path as a volume
VOLUME /usr/local/apache2/htdocs

docker-compose.yml

version: "3.7"

# declare the volume to share between the containers
volumes:
  shared_volume:

services:
  data:
    build:
      context: ./
      dockerfile: data.Dockerfile
    container_name: data
    volumes:
      - "shared_volume:/var/shared_volume"
  httpd:
    build:
      context: ./
      dockerfile: httpd.Dockerfile
    container_name: httpd
    volumes:
      - "shared_volume:/usr/local/apache2/htdocs"
    ports:
      - "80:80"

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Is this page visible in your httpd container?</title>
  </head>
  <body>
    <h1>I sure hope you can see this page?</h1>
  </body>
</html>

Том shared_volume теперь будет док-томом, управляемым на хосте.Оба контейнера будут монтировать его по пути в соответствующей файловой системе.

Запустить пример

Просто docker-compose up, а когда он запущен, посетить http://localhost.

Я создал суть решения здесь.


Вкратце, установка непосредственно из одного контейнера в другой

Если вы хотите смонтировать каталог прямо из «контейнера данных» в ваш контейнер Apache - тогда вы столкнетесь с кучей проблем.Это лучше всего объяснить в ответе на этот вопрос: Монтирование общих ресурсов nfs внутри контейнера Docker

...