Php 是否可以通过Dockerfile运行bash脚本,并在docker compose up-d之后保持容器运行?

Php 是否可以通过Dockerfile运行bash脚本,并在docker compose up-d之后保持容器运行?,php,docker,docker-compose,Php,Docker,Docker Compose,以下install.sh脚本文件自动在容器中安装my Laravel依赖项: #/bin/bash 日志文件=/tmp/install_diario_$(日期+%Y%m%d%H%m%S”).log [-f../.env]| cp../.env.docker../.env 函数误差{ echo-e“\e[31m\e[1m[错误]” echo-e'有关详细信息,请参见'$LOGFILE'\e[0m' 出口1 } 功能正常{ echo-e“\t\e[32m\e[1m[OK]\e[0m” } 已安装的功

以下install.sh脚本文件自动在容器中安装my Laravel依赖项:

#/bin/bash
日志文件=/tmp/install_diario_$(日期+%Y%m%d%H%m%S”).log
[-f../.env]| cp../.env.docker../.env
函数误差{
echo-e“\e[31m\e[1m[错误]”
echo-e'有关详细信息,请参见'$LOGFILE'\e[0m'
出口1
}
功能正常{
echo-e“\t\e[32m\e[1m[OK]\e[0m”
}
已安装的功能{
echo-e“\t\e[29m\e[1m[OK]\e[0m”
}
echo“[+]安装PHP软件包”
composer安装-d”/var/www/html“2>$LOGFILE>>$LOGFILE
如果[$?-等式1];则
echo“[!]配置已中止。正在退出…”
fi
回显“[+]生成应用程序密钥”
php../artisan密钥:生成#2>>$LOGFILE>>$LOGFILE
php../artisan passport:安装#2>>$LOGFILE>>$LOGFILE
回显“[+]填充数据库”
#cd..&&make resetdb
echo“[+]后端安装成功。”
回声“”
php../artisan passport:显示
echo“[+]前端安装”
npm安装2>>$LOGFILE>>$LOGFILE
但是,我不想手动运行此操作,而是在容器启动时运行。因此,我尝试在Dockerfile中使用以下命令:

WORKDIR /var/www/html/docker
ADD install.sh .
RUN chmod +x ./install.sh
CMD ./install.sh
CMD ./install.sh
# Don't override COMMAND, use the default one
#CMD ./install.sh

COPY entrypoint /usr/bin/
RUN chmod +x /usr/bin/entrypoint
ENTRYPOINT /usr/bin/entrypoint
Obs.:脚本位于名为docker的文件夹中

但是当我运行
dockercompose-up--build-d
时,我的容器会在几秒钟后退出(当脚本完成时)

我试图寻找解决方案,但没有一个对我有效(例如,在我的脚本末尾包含
/bin/bash


有人知道这是否真的可以实现,或者我应该告诉我的同事使用
docker exec-it install.sh
手动运行此脚本吗?

对于docker容器,除非您在装入的卷中放入某种文件,否则它的第一次启动和结果启动之间没有区别

您可能需要的是一个启动脚本,它知道这是否是第一次启动,请运行安装脚本,然后记住不要再次运行它

因此,除了安装脚本之外,您可能还应该有如下启动脚本:

!/bin/bash
#假设您将此文件夹装载到主机系统
已安装的\u VAR=/VAR/run/laravel
#仅在第一次运行时运行安装
如果[!-f$MOUNTED_VAR/installed];则
./install.sh
fi
#例如,启动服务的一些命令
systemctl启动php fpm
在docker文件中,还需要包含以下内容 要启动的脚本

WORKDIR /var/www/html/docker
ADD install.sh .
RUN chmod +x ./install.sh
ADD start.sh .
RUN chmod +x ./start.sh
CMD ./start.sh

这里的问题是Dockerfile中的以下行:

WORKDIR /var/www/html/docker
ADD install.sh .
RUN chmod +x ./install.sh
CMD ./install.sh
CMD ./install.sh
# Don't override COMMAND, use the default one
#CMD ./install.sh

COPY entrypoint /usr/bin/
RUN chmod +x /usr/bin/entrypoint
ENTRYPOINT /usr/bin/entrypoint
事实上,您的脚本覆盖(即代替)默认的
phpfpm
命令

解决方案1:在
install.sh
脚本末尾添加一行以调用
php fpm

exec "php-fpm"
警告:
php fpm
不能作为服务启动,它必须在前台运行,以保持容器正常运行

解决方案2:实现启动安装脚本的自定义入口点

  • 从Dockerfile中删除/注释
    CMD
  • 实现定制的入口点脚本
  • 例如:

    在Dockerfile中:

    WORKDIR /var/www/html/docker
    ADD install.sh .
    RUN chmod +x ./install.sh
    CMD ./install.sh
    
    CMD ./install.sh
    
    # Don't override COMMAND, use the default one
    #CMD ./install.sh
    
    COPY entrypoint /usr/bin/
    RUN chmod +x /usr/bin/entrypoint
    ENTRYPOINT /usr/bin/entrypoint
    
    和入口点脚本:

    #运行安装脚本
    /路径/to/install.sh
    #执行默认命令,即php fpm
    执行官“$@”
    

    *注意:这是最基本的工作代码,请随意自定义/丰富此示例-例如使用。

    是的,容器退出,因为脚本完成并退出,没有运行进程的容器不再是容器。只要您希望容器运行,设置CMD的任何内容都需要保持运行同样,容器重新[初始化]从长远来看,启动期间的外部服务可能会变成某种形式的问题。我建议至少将init和服务部分分离到单独的工作流中。此外,还应该在构建过程中安装依赖项,而不是每次容器启动时。是的,我理解容器r取消该选项并退出,但“将初始化和服务部分分离为单独的工作流”是什么意思?这是否意味着可以完成我想要的任务?但我可以在Dockerfile中运行install.sh脚本中的命令吗?不行?我实际上放弃了这个想法,但我会尝试您的解决方案好的,让我知道它是否有效;)exec“php fpm”作为entrypoint.sh脚本的最后一行完成了任务。谢谢!