Я предлагаю вам объявить том докера, чтобы разделить его между двумя контейнерами.Один из контейнеров может быть предварительно собран с некоторыми данными в томе пути.Затем другой контейнер может смонтировать тот же том и увидеть те же данные.
Одна очень важная деталь, которую следует здесь учитывать, - файлы тома не будут видны в контейнере монтирования, если вы привязываете его к месту в файловой системе контейнера, где другие файлы уже существуют. Это должно быть пустое место!
Чтобы это работало для вас, вам нужно создать 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