在 docker 文件上使用入口点会破坏 laravel 构建

using enterypoint on docker file breakes the laravel build

嗨,我有一个 docker 文件,如下所示:

. 
.
.
RUN composer config --global process-timeout 2000

# Copy source and create needed files & directories
COPY . /var/www/html


# Copy existing application directory permissions
RUN chmod -R  777 /var/www/html/storage/
RUN apt-get install -y htop
RUN apt-get install -y vim
RUN mv .env.staging .env


COPY ./docker/scripts/start.sh /usr/local/bin/start
RUN chown -R www-data:www-data /var/www/html \
    && chmod u+x /usr/local/bin/start



ENTRYPOINT sh "./docker/scripts/mainapp.entrypoint.sh"

我的 mainapp.enterypoint.sh 如下所示:

#!/usr/bin/env sh
set -xe
chmod 777 -R storage
composer install
composer du
echo -e "Key generating...\n"
php artisan key:generate

#supervisord
service supervisor start


当它进入入口点时 laravel 容器没有错误地中断。但是当我评论这行时:

#ENTRYPOINT sh "./docker/scripts/mainapp.entrypoint.sh"

一切都很好。 我从我的容器中得到的唯一日志是这一行:

+ echo -e Key generating...\n
+ php artisan key:generate
Application key set successfully.
+ service supervisor start
Starting supervisor: supervisord.

没有错误,容器存在错误代码:0

app exited with code 0

一般来说,像 service 这样的命令在 Docker 中不起作用。在您的特定情况下,service 命令可能会或可能不会 运行 成功,但它会立即 returns;然后你到达入口点脚本的末尾,当你到达入口点脚本的末尾时,容器离开。

通常您希望入口点脚本以特殊的 shell 命令 exec "$@" 结束,这将切换到 运行 主容器命令:

#!/bin/sh

# The application should have already been installed in the Dockerfile;
# no need to repeat it.

# Create key material if necessary.
if ! grep -q APP_KEY .env 2>/dev/null ; then
  php artisan key:generate
fi

# Run the main container command
exec "$@"

在您的 Docker 文件中,将此脚本设置为 ENTRYPOINT(它必须使用 JSON-array 形式),并设置您要执行的单个命令 运行作为主容器进程为CMD。这必须 运行 作为前台进程。 运行 多个单独的容器通常比在单个容器中尝试 运行 supervisord 更好。

# Copy source and create needed files & directories
COPY . /var/www/html

# Install library dependencies
RUN composer install

# Metadata to run the container
ENTRYPOINT ["./docker/scripts/mainapp.entrypoint.sh"]
CMD ["php-fpm"]