在 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"]
嗨,我有一个 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"]