我正在通过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 toolkit,并且我在Windows 10家庭版中
看来您需要在容器中启动两个进程gearman
和apache
。并且两者都需要配置(编译)。因此,您需要将run.sh
分为两部分。第一个用于编译gearman
,第二个用于启动apache
和gearman
。这是一个示例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 document获取有关在容器中启动多个进程的更多信息>