繁体   English   中英

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

[英]Is it possible to run a bash script through Dockerfile and keep the container running after docker-compose up -d?

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

#!/bin/bash

LOGFILE=/tmp/install_diario_$(date +"%Y%m%d%H%M%S").log


[ -f ../.env ] || cp ../.env.docker ../.env

function error {
    echo -e "\e[31m\e[1m[ERROR]"
    echo -e 'See' $LOGFILE 'to more information\e[0m'
    exit 1
}

function ok {
    echo -e "\t\e[32m\e[1m[OK]\e[0m"
}

function installed {
    echo -e "\t\e[29m\e[1m[OK]\e[0m"
}

echo '[+] Installing PHP packages'
composer install -d "/var/www/html" 2>> $LOGFILE >> $LOGFILE

if [ $? -eq 1 ]; then
    echo '[!] Configuration Aborted. Exiting...'    
fi

echo '[+] Generating app keys'
php ../artisan key:generate #2>> $LOGFILE >> $LOGFILE
php ../artisan passport:install #2>> $LOGFILE >> $LOGFILE


echo '[+] Populating database'
# cd .. && make resetdb

echo '[+] Backend installation sucessfull.'
echo ""

php ../artisan passport:show

echo '[+] Front-end install'
npm install 2>> $LOGFILE >> $LOGFILE

但是,我不想手动运行它,而是在容器启动时运行。 所以我尝试在我的 Dockerfile 中使用以下命令:

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

观察:脚本位于名为 docker 的文件夹中

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

我尝试寻找解决方案,但没有一个对我有用(例如,在我的脚本末尾包括/bin/bash )。

有谁知道这是否真的可以做到,或者我应该告诉我的同事用docker exec -it <app_id> install.sh手动运行这个脚本?

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

CMD ./install.sh

实际上,您的脚本会覆盖(即代替调用)默认的php-fpm命令。

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

exec "php-fpm"

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

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

  1. 从 Dockerfile 中删除/注释CMD
  2. 实现定制的入口点脚本。

例如:

在 Dockerfile 中:

# 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

和入口点脚本:

# Run the install script
/path/to/install.sh

# Execute the default command, ie php-fpm
exec "$@"

*NB:这是最低限度的基本工作代码,请随意自定义/丰富此示例 - 例如使用官方 docker php 入口点

对于 docker 容器,它的第一次启动与结果启动之间没有区别,除非您将某种文件放入已安装的卷中。

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

所以除了你的安装脚本,你可能应该有一个像这样的启动脚本:

#!/bin/bash

# Assuming you mount this folder to your host system
MOUNTED_VAR=/var/run/laravel

# Only run the install on first run
if [ ! -f $MOUNTED_VAR/installed ]; then
  ./install.sh
fi

# Some command to start the service, for example
systemctl start 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM