Создание файлов / папок на docker-compose build или docker-compose up
Я пробую свои первые шаги в Docker, поэтому я попытался сделать Dockerfile, который создает простой индекс.html и каталог изображений (см. код ниже)
затем я запускаю сборку docker-compose для создания образа и docker-compose-up для запуска сервера. Но я не получаю индекса файлов.html или изображения папок.
Это мой Dockerfile:
FROM php:apache
MAINTAINER brent@dropsolid.com
WORKDIR /var/www/html
RUN touch index.html
&& mkdir images
и это мой докер-сочинять.в формате YML
version: '2'
services:
web:
build: .docker/web
ports:
- "80:80"
volumes:
- ./docroot:/var/www/html
Я ожидал бы, что это создаст папку docroot с каталогом изображений и индексом.html, но я получаю только docroot.
1 ответов
изображение содержит эти файлы
файл Dockerfile содержит инструкции по созданию образа. Образ, который вы создали из этого Dockerfile тут содержат index.html
и images/
.
но, вы переехали их в контейнере
во время выполнения вы создали контейнер из созданного вами образа. В этом контейнере вы смонтировали внешний каталог ./docroot
as /var/www/html
.
гора скроет то, что было на этом путь раньше, поэтому это крепление скроет предыдущее содержимое /var/www/html
, заменяя их тем, что есть в ./docroot
.
кладешь в гору
в комментариях вы спрашивали
есть ли возможность сначала монтировать, а затем создавать файлы или что-то еще? Или это невозможно?
способ, которым вы сделали вещи, вы смонтировали над исходными файлами, поэтому они больше не доступны после того, как контейнер создан.
есть несколько способов справиться с этим.
изменить свой путь в образе
если вы поместите эти файлы в другой путь в своем образе, то они не будут перезаписаны монтированием.
WORKDIR /var/www/alternate-html
RUN touch index.html \
&& mkdir images
WORKDIR /var/www/html
теперь, во время выполнения вы все равно будете иметь это крепление в /var/www/html
, который будет содержать содержимое из внешнего каталога. Который может быть или не быть пустым каталогом. Вы можете сказать контейнеру при запуске, чтобы запустить сценарий и копируй там, если хочешь.
COPY entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
(это предполагает, что у вас нет определенной точки входа - если вы это сделаете, вам, возможно, просто нужно настроить существующий скрипт.)
entrypoint.sh:
#!/bin/sh
cp -r /var/www/alternate-html/* /var/www/html
exec "$@"
это будет работать cp
команда, а затем передать контроль над тем, что CMD
для этого образа.
обращение с ним внешне
у вас также есть возможность просто предварительно заполнить файлы, которые вы хотите в ./docroot
внешне. Тогда они будут просто там, когда контейнер запускается и добавляет крепление каталога.