【发布时间】:2020-05-10 11:32:44
【问题描述】:
我正在通过 docker-composer up 运行 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 工具包并且我在 Windows 10 主页上
【问题讨论】:
-
您可能希望在 Dockerfile 中运行
make序列,而不是在容器启动时运行,这样每次重建时它只发生一次,而不是每次启动时发生一次。但是,如果您正在考虑运行第二个进程,那么第二个容器(可能还有第二个图像)通常是更好的路径。 (你根本无法在 Dockerfile 中启动后台进程,而且在一个容器中运行多个进程往往比必要的要复杂。) -
谢谢。您可以指出我可以在哪里阅读更多相关信息的任何资源?
-
直到
make install的命令应该是docker构建过程的一部分,而其余命令应该是docker-compuse up的一部分。如果您可以粘贴 Docker 文件的示例,将会有所帮助。 -
编辑了我的帖子以包含 docker 文件
标签: bash docker docker-compose dockerfile gearman