docker入口点sh文件重新启动

fri*_*day -1 php docker dockerfile docker-compose

我正在用我的 php 项目测试 docker。测试中一切正常,但如果我添加ENTRYPOINT,docker 就会重新启动。

这是我的 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
Run Code Online (Sandbox Code Playgroud)

Dockerfile

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 && echo $TZ > /etc/timezone

# Install system dependencies
RUN apt-get update \
    && 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 \
    && docker-php-ext-configure gd  \
    && docker-php-ext-install gd \
    && apt-get install -y --no-install-recommends libgmp-dev \
    && docker-php-ext-install gmp \
    && docker-php-ext-install mysqli pdo_mysql zip \
    && docker-php-ext-enable opcache \
    && apt-get autoclean -y \
    && rm -rf /var/lib/apt/lists/* \
    && 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 && \
    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"]
Run Code Online (Sandbox Code Playgroud)

启动容器.sh 文件

#!/usr/bin/env bash

set -e

cd /var/www  
php artisan optimize
php artisan view:cache
#composer install && composer dump-autoload

exec "$@"
Run Code Online (Sandbox Code Playgroud)

我还打印该 docker 映像的日志。

Configuration cached successfully!
Route cache cleared!
Routes cached successfully!
Files cached successfully!
Compiled views cleared!
Blade templates cached successfully!
Run Code Online (Sandbox Code Playgroud)

我认为我的错误是docker 容器在运行 start-container.sh file 后重新启动。当我谷歌搜索时,有些人使用PHP artisan脚本和 ENTRYPOINT sh 文件。

我应该怎么做才能避免使用 ENTRYPOINT sh 文件一次又一次地重新启动?

Dav*_*aze 5

您的入口点脚本以行结尾exec "$@"。这会运行图像的CMD,并且通常是最佳实践。但是,您的映像没有CMD,因此该命令只是扩展为裸exec,这会导致主容器进程退出。

构建的镜像FROM php:fpm通常不会有CMD一行,因为基础镜像的Dockerfile指定了CMD ["php-fpm"];将您的应用程序代码写入派生映像就足够了COPY,并且基础映像CMD知道如何运行它。但是,ENTRYPOINT派生映像中的设置会CMD从基础映像中重置(请参阅Dockerfile 文档中讨论CMDENTRYPOINT的注释)。这意味着您需要重复基本图像的CMD

ENTRYPOINT ["start-container.sh"]
CMD ["php-fpm"] # duplicated from base image, because you reset ENTRYPOINT
Run Code Online (Sandbox Code Playgroud)