Создание файлов / папок на 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 внешне. Тогда они будут просто там, когда контейнер запускается и добавляет крепление каталога.