【问题标题】:Run Bash script once Docker container is loaded加载 Docker 容器后运行 Bash 脚本
【发布时间】: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


【解决方案1】:

看起来您需要在容器中启动两个进程,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 document获取有关在容器中启动多个进程的更多信息

【讨论】:

  • 它给出一个错误 cd: can't cd to var/www/html/gearman1.1.2 尽管文件夹存在
  • @Edi0 我错过了路径前面的斜杠字符。所以我认为在您将var/www/html/gearman1.1.2 更改为/var/www/html/gearman1.1.2 后它会起作用
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2021-09-16
  • 2017-02-21
  • 1970-01-01
  • 2017-12-01
  • 2018-05-16
  • 2016-03-01
  • 2023-01-25
相关资源
最近更新 更多