У меня есть оценка, в которой я должен создать контейнер Docker с CakePHP. У меня уже есть работающий контейнер Docker с CakePHP, и я запускаю для своего контейнера следующие команды:
docker-compose build
docker-compose run cakephp composer install --no-interaction
docker-compose run cakephp bin/cake migrations migrate
docker-compose run cakephp bin/cake migrations seed
docker-compose up
Цель состоит в том, чтобы сократить процесс до выполнения только одной команды докер-компоновать, чтобы иметь возможность начать тестирование контейнера. Я новичок в Docker и CakePHP, поэтому не знаю, как это сделать.
Любая помощь приветствуется!
Докерфайл
#start with our base image (the foundation) - version 7.1.29
FROM php:7.1.29-apache
#install all the system dependencies and enable PHP modules
RUN apt-get update && apt-get install -y \
gcc \
make \
autoconf \
libc-dev \
pkg-config \
libicu-dev \
libpq-dev \
libmcrypt-dev \
mysql-client \
git \
zip \
unzip \
&& rm -r /var/lib/apt/lists/* \
&& docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
&& docker-php-ext-install \
intl \
mbstring \
mcrypt \
pcntl \
pdo_mysql \
pdo_pgsql \
pgsql \
opcache
RUN set -eux; apt-get update; apt-get install -y libzip-dev zlib1g-dev; docker-php-ext-install zip
#install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
ENV COMPOSER_ALLOW_SUPERUSER=1
#set our application folder as an environment variable
ENV APP_HOME /var/www/html
#change uid and gid of apache to docker user uid/gid
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
#change the web_root to laravel /var/www/html/public folder
RUN sed -i -e "s/html/html/webroot/g" /etc/apache2/sites-enabled/000-default.conf
# enable apache module rewrite
RUN a2enmod rewrite && \
echo "ServerName localhost" >> /etc/apache2/apache2.conf
#copy source files and run composer
COPY . $APP_HOME
# install all PHP dependencies
RUN composer install --no-interaction
#change ownership of our applications
RUN chown -R www-data:www-data $APP_HOME
докер-compose.yml
version: '2'
services:
cakephp:
build: .
depends_on:
- mysql
links:
- "mysql"
ports:
- "4000:80"
volumes:
- .:/var/www/html/
environment:
- SECURITY_SALT= *some salt here*
- MYSQL_URL=mysql
- MYSQL_USERNAME=root
- MYSQL_PASSWORD=root
mysql:
image: mysql:5.6
volumes:
- mysql-data:/var/lib/mysql
environment:
- MYSQL_DATABASE=cakephp
- MYSQL_ROOT_PASSWORD=root
volumes:
mysql-data:






Что я обычно делаю, чтобы сократить количество команд при работе с Docker и Docker Compose в целом, так это использование Makefile.
Итак, в вашем случае вы можете написать что-то вроде:
Makefile
SUDO := $(shell groups | grep -q docker || echo sudo)
.PHONY: start
start:
$(SUDO) docker-compose build \
&& $(SUDO) docker-compose run cakephp composer install --no-interaction \
&& $(SUDO) docker-compose run cakephp bin/cake migrations migrate \
&& $(SUDO) docker-compose run cakephp bin/cake migrations seed \
&& $(SUDO) docker-compose up
Все, что вам нужно сделать, это поместить этот файл в папку вашего проекта и запустить make start.
(Часть $(SUDO) гарантирует, что вы сможете комфортно запускать это даже с пользователем, не входящим в группу docker.)
Чтобы просто запустить docker-compose up (возможно, с флагом --build), вам нужно будет написать небольшой скрипт, который вы COPY вставите в образ Docker (вы уже делаете это с COPY . $APP_HOME — при условии, что вы поместите этот скрипт там, где точки контекста сборки Docker to), а затем используйте его как ENTRYPOINT.
Что-то вроде этого должно сработать для вас.
точка входа.sh:
#!/bin/sh
set -e
cakephp composer install --no-interaction
cakephp bin/cake migrations migrate
cakephp bin/cake migrations seed
exec "$@"
В вашем Dockerfile вам нужно будет поместить ENTRYPOINT ["/bin/sh", "entrypoint.sh"]
@Logan, я обновил свой ответ, пожалуйста, проверьте, можете ли вы пойти оттуда. :)
Спасибо за помощь! Это очень ценно :)
Ваш ответ очень полезен, и спасибо, что нашли время ответить. Сама оценка требует, чтобы завершенный контейнер нуждался только в команде
docker-compose upдля возможности тестирования. Я читал в Интернете, что, возможно, сценарий оболочки, написанный в Dockerfile, может работать, но у меня еще не было времени попробовать это.