перезапуск файла docker entrypoint sh

#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. О ! Ты спас меня. Спасибо за ваше объяснение