#php #docker #docker-compose #dockerfile
Вопрос:
Я тестирую docker с помощью своего php-проекта. В тестировании все в порядке, но если я добавлю ТОЧКУ входа, докер перезапустится.
Вот мой файл docker compose
version: "3.7"
services:
#Laravel App
app:
build:
args:
user: maruan
uid: 1000
context: ./docker/7.4
dockerfile: Dockerfile
# command: sh -c "start-container.sh"
image: laravel-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- app-network
#Nginx Service
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker/7.4/nginx/conf.d:/etc/nginx/conf.d/default.conf
networks:
- app-network
#Mysl Service
db:
image: mysql:8
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
networks:
- app-network
networks:
app-network:
driver: bridge
Докерфайл
FROM php:7.4-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
WORKDIR /var/www
ENV TZ=UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime amp;amp; echo $TZ > /etc/timezone
# Install system dependencies
RUN apt-get update
amp;amp; apt-get install -y --no-install-recommends build-essential mariadb-client libfreetype6-dev libjpeg-dev libpng-dev libwebp-dev zlib1g-dev libzip-dev gcc g make vim unzip git jpegoptim optipng pngquant gifsicle locales libonig-dev
amp;amp; docker-php-ext-configure gd
amp;amp; docker-php-ext-install gd
amp;amp; apt-get install -y --no-install-recommends libgmp-dev
amp;amp; docker-php-ext-install gmp
amp;amp; docker-php-ext-install mysqli pdo_mysql zip
amp;amp; docker-php-ext-enable opcache
amp;amp; apt-get autoclean -y
amp;amp; rm -rf /var/lib/apt/lists/*
amp;amp; rm -rf /tmp/pear/
COPY . /var/www
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer amp;amp;
chown -R $user:$user /home/$user
COPY start-container.sh /usr/local/bin/start-container.sh
RUN chmod x /usr/local/bin/start-container.sh
ENTRYPOINT ["start-container.sh"]
start-container.sh файл
#!/usr/bin/env bash
set -e
cd /var/www
php artisan optimize
php artisan view:cache
#composer install amp;amp; composer dump-autoload
exec "$@"
Я также печатаю журнал для этого изображения докера.
Configuration cached successfully!
Route cache cleared!
Routes cached successfully!
Files cached successfully!
Compiled views cleared!
Blade templates cached successfully!
Я думаю, что моя ошибка в том, что контейнер docker перезапускается после запуска start-container.sh файл. Когда я гуглю, некоторые люди используют скрипт PHP artisan с файлом ENTRYPOINT sh.
Что я должен сделать, чтобы не перезапускаться снова и снова с файлом ENTRYPOINT sh?
Ответ №1:
Ваш сценарий точки входа заканчивается строкой exec "$@"
. Это запускает изображение CMD
и , как правило, является лучшей практикой. Однако в вашем изображении нет a CMD
, поэтому эта команда просто расширяется до пустого exec
, что приводит к завершению основного процесса контейнера.
В построенном изображении FROM php:fpm
часто не будет CMD
строки, поскольку в файле Dockerfile базового изображения указано CMD ["php-fpm"]
; этого достаточно, чтобы COPY
код вашего приложения превратился в производный образ, и базовый образ CMD
знает, как его запустить. Однако установка ENTRYPOINT
в производном образе сбрасывает значение CMD
из базового образа (см. Примечание в документации по Dockerfile, обсуждающей CMD
и ENTRYPOINT
совместно). Это означает, что вам нужно повторить базовое изображение CMD
:
ENTRYPOINT ["start-container.sh"]
CMD ["php-fpm"] # duplicated from base image, because you reset ENTRYPOINT
Комментарии:
1. Ты опередил меня в этом
2. О ! Ты спас меня. Спасибо за ваше объяснение