Docker: создание полностью установленного приложения PHP - PullRequest
0 голосов
/ 28 февраля 2019

Могу ли я использовать docker-compose для создания одношаговой установки для полностью установленного приложения PHP?Так как это довольно расплывчатые вопросы.Я буду использовать WordPress в качестве примера.

Если я посмотрю на официальные репозитории WordPress Docker , я вижу, что уже есть супер-полезный yml файл для docker-composer

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'

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

Что меня не устраивает, так это полностью установленный WordPress.Как и во многих PHP-приложениях, для полной установки необходимо задать несколько дополнительных полей конфигурации, и также несколько дополнительных полей базы данных.

Это означает, что я могуне устанавливайте приложение полностью, пока оба контейнера wordpress и db не будут полностью открыты.Я думал о том, чтобы найти обходной путь, когда у меня есть CMD или ENTRYPOINT, ожидающие установления соединения с БД, но базовый файл (ы) WordPress Docker уже использует ENTRYPOINT и CMD, так что это не так.опция.(или это?)

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

Ответы [ 4 ]

0 голосов
/ 04 марта 2019

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

Как вы уже знаете, у изображения wordpress есть свой собственный ENTRYPOINT, который является сценарием docker-entrypoint.sh.

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

Вы можете сделать это следующим образом:

  • Startвашего контейнера и скопируйте содержимое существующего docker-entrypoint.sh

  • Создайте новый docker-entrypoint.sh вне контейнера и отредактируйте этот скрипт, добавив команду chmod в соответствующее место.

  • Добавьте в свой Dockerfile строку, чтобы скопировать этот новый сценарий точки входа в
    местоположение /usr/local/bin/docker-entrypoint.sh

ПРИМЕЧАНИЕ:

Doне ставьте свою пользовательскую команду в конец скрипта docker-entrypoint.sh.Вы можете поместить его в любом месте перед строкой exec "$@".

0 голосов
/ 28 февраля 2019

Если есть дополнительные шаги, которые вы выполняете вручную или с помощью сценариев после запуска docker-compose up для docker-compose, опубликованной в вашем вопросе, вы можете изменить исходное изображение WordPress своим собственным изображением, чтобы оно работало в соответствии с вашими ожиданиями.Все, что вам нужно для бизнеса, - это начать писать новый Dockerfile, который создаст новое настроенное изображение WordPress.Таким образом, вы можете сделать следующее в качестве примера:

FROM wordpress:5.1.0-php7.1-apache
COPY custom_docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["custom_docker-entrypoint.sh"]
CMD ["apache2-foreground"]

custom_docker-entrypoint.sh представляет дополнительные шаги, которые необходимо выполнить.также вы можете ввести новые переменные среды в сценарий точки входа, чтобы вы могли сделать процесс максимально динамичным для разных клиентов без необходимости создания настраиваемого образа для каждого клиента.

Сгенерированный образ можно использовать в вашем докересоставить файл вместо официального

0 голосов
/ 04 марта 2019

Насколько я знаю, образ MySQL имеет свой собственный скрипт запуска, который может все еще работать после того, как контейнер будет готов.Этот сценарий запуска можно использовать для импорта данных в базу данных. Соединения MySQL по-прежнему не будут приняты, но docket будет думать, что ваша база данных готова.

Для вас это означает, что если по какой-либо причине база данныхСценарий инициализации работает дольше, он останавливает работу команд установки php.

Возможно, вам потребуется реализовать поток опроса, который будет ожидать запуска базы данных - только затем запустите сценарии установки на php.

Вот статья, в которой я нашел подробности аналогичной проблемы.

https://cweiske.de/tagebuch/docker-mysql-available.htm

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

РЕДАКТИРОВАТЬ:

Проверьте проверки работоспособности докера.Это может соответствовать вашему случаю использования.

https://docs.docker.com/compose/compose-file/#healthcheck

0 голосов
/ 28 февраля 2019

Что вам, вероятно, придется сделать, это создать свой собственный Dockerfile на основе образа Wordpress, а затем дать им свой собственный материал для запуска.

Я думаю, что-то подобное должно работать

docker-compose.yml

version: '3.1'

services:

  wordpress:
    build:
      context: ./docker/wordpress
    restart: always
    ports:
      - 8080:80
    depends_on:
      - "db"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'

. / Docker / wordpress / Dockerfile

FROM wordpress
RUN your-own-commands

Я только кратко собрал, поэтому он не проверен, но должен датьВы общее представление и направление

...