加载Docker容器后运行Bash脚本



我正在通过Docker composer运行Docker。这是一个LAMP环境,运行良好。我有一个docker文件,我正在其中安装一些Apache模块并加载它们。加载Docker容器后,我想运行bash脚本来安装php库并启动服务。我的bash脚本低于

#!/bin/bash
cd var/www/html/gearman-1.1.2
./configure
make
make install
service apache2 restart
gearmand -d
echo "German should be working now"

我想在每次执行docker composer up-d命令时都运行这个脚本,这样我就不必手动执行这个过程了。

我正在Docker文件中添加以下行

RUN chmod +x /var/www/html/run.sh
RUN run.sh

上面的命令抛出错误,导致Apache服务器无法启动。你能告诉我在docker启动后执行bash脚本的正确方法是什么吗。我的bash脚本的位置在var/www/html中,我也将这个位置安装到我的本地驱动器上。

当我在登录到容器后通过命令链接手动运行Bash脚本时,它运行得很好。

完整的docker文件如下所示

FROM php:5.6-apache
RUN apt-get -y update && apt-get upgrade -y
# Install tools && libraries
RUN apt-get -y install --fix-missing apt-utils nano wget dialog 
build-essential git curl libcurl3 libcurl3-dev zip 
libmcrypt-dev libsqlite3-dev libsqlite3-0 mysql-client 
zlib1g-dev libicu-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev libgearman-dev 
gearman-job-server 
&& rm -rf /var/lib/apt/lists/*
# Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# PHP5 Extensions
RUN docker-php-ext-install curl 
&& docker-php-ext-install tokenizer 
&& docker-php-ext-install json 
&& docker-php-ext-install mcrypt 
&& docker-php-ext-install pdo_mysql 
&& docker-php-ext-install pdo_sqlite 
&& docker-php-ext-install mysqli 
&& docker-php-ext-install zip 
&& docker-php-ext-install -j$(nproc) intl 
&& docker-php-ext-install mbstring 
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
&& docker-php-ext-install -j$(nproc) gd 
&& pecl install xdebug-2.5.5 && docker-php-ext-enable xdebug 
&& echo "xdebug.remote_enable=1" >> /usr/local/etc/php/php.ini

# Enable apache modules
RUN a2enmod rewrite headers
EXPOSE 80
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
#RUN /bin/bash "chmod +x /var/www/html/run.sh"
#RUN run.sh

值得一提的是,我正在使用docker工具包,我在Windows10家庭上

看起来您需要在容器中启动两个进程gearmanapache。并且这两者都需要进行配置(编译(。所以你需要把你的run.sh分成两部分。第一个用于编译gearman,第二个用于启动apachegearman。这是一个示例Dockerfile和一个示例入口点文件:

entrypoint.sh:

#!/bin/bash
gearmand -d
status=$?
if [ $status -ne 0 ]; then
echo "Failed to start gearmand: $status"
exit $status
fi
/usr/sbin/apache2ctl -D FOREGROUND;

Dockerfile:

FROM php:5.6-apache
RUN apt-get -y update && apt-get upgrade -y
# Install your PHP extensions and dependencies ...
# Enable apache modules
RUN a2enmod rewrite headers
# compile gearman and install it
RUN cd /var/www/html/gearman-1.1.2 && ./configure && make && make install
EXPOSE 80
ADD entrypoint.sh /var/www/html/
RUN chmod +x /var/www/html/entrypoint.sh
ENTRYPOINT ["/var/www/html/entrypoint.sh"]

您可以从Docker文档中获得有关在容器中启动多个进程的更多信息

最新更新