簡體   English   中英

在Docker容器啟動時執行.sh文件並讓容器運行

[英]Excecute .sh file on start of Docker container and let container run

我有一個為網絡服務器提供服務的Docker容器。 在容器每次啟動時,我都想執行一個小shell腳本。 必須執行的腳本只有一個語句。

/var/www/html/app/Console/cake schema update -y

為此,我創建了一個名為schemaupdate.sh的.sh文件,使用schemaupdate.sh其復制到docker容器中,並將其復制到/etc/init.d文件夾中。 此外,我使它可執行並注冊到啟動。

COPY schemaupdate.sh /etc/init.d/schemaupdate.sh
chmod 755 /etc/init.d/schemaupdate.sh
update-rc.d schemaupdate.sh defaults

該文件已成功復制到容器中。 但是,docker容器啟動時不會執行腳本。 當我手動調用sh文件時,一切運行正常。

我如何實現在容器每次啟動時執行文件/語句? 重要的是,腳本應在啟動時執行,並且容器(因此Web服務器)仍將繼續運行! 該腳本僅進行一點更新檢查,並且在檢查之后,Web服務器繼續運行。

該容器是基於debian的容器。 這是初始dockerfile。

#start with base Image from php 
FROM php:7.3-apache

#install system dependencies and enable PHP modules

RUN apt-get update && apt-get install -y \
      libicu-dev \
      libpq-dev \
      libmcrypt-dev \
      mysql-client \
      git \
      zip \
      unzip \
    && rm -r /var/lib/apt/lists/* \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
    && docker-php-ext-install \
      intl \
      mbstring \
      pcntl \
      pdo_mysql \
      pdo_pgsql \
      pgsql \
      opcache

#     zip \
#     mcrypt \

#configure imap for mails
RUN apt-get update && \
    apt-get install -y \
        libc-client-dev libkrb5-dev && \
    rm -r /var/lib/apt/lists/*

RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl && \
docker-php-ext-install -j$(nproc) imap


#install mcrypt
RUN apt-get update \
    && apt-get install -y libmcrypt-dev \
    && rm -rf /var/lib/apt/lists/* \
    && pecl install mcrypt-1.0.2 \
    && docker-php-ext-enable mcrypt

#install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

#set our application folder as an environment variable
ENV APP_HOME /var/www/html

#change uid and gid of apache to docker user uid/gid
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

#change the web_root to cakephp /var/www/html/webroot folder
#RUN sed -i -e "s/html/html\/webroot/g" /etc/apache2/sites-enabled/000-default.conf

# enable apache module rewrite
RUN a2enmod rewrite

#copy source files and run composer
#COPY src/ /var/www/html
#COPY src/ $APP_HOME

# install all PHP dependencies
#RUN composer install --no-interaction

#SET Volume
VOLUME /var/www/html/

#change ownership of our applications
RUN chown -R www-data:www-data $APP_HOME

#SET ENV VARIABLES

COPY schemaupdate.sh /etc/init.d/schemaupdate.sh
chmod 755 /etc/init.d/schemaupdate.sh
update-rc.d schemaupdate.sh defaults

EXPOSE 80

/etc/init.d/不相關。 容器不是具有重量級SysV初始化樣式啟動順序的完全成熟的操作系統。 他們運行一個命令,就是這樣。

您應該將命令作為RUN語句添加到Dockerfile中,以便將其結果烘焙到映像中,或者應該直接由容器的CMDENTRYPOINT指令調用它。

我終於使用了入口點。 我刪除了COPY,chmod和update-rc。 入口點如下所示。

ENTRYPOINT [ "sh", "-c", "/var/www/html/app/Console/cake schema update -y && /var/www/html/app/Console/cake schema update -y && /usr/sbin/apachectl -D FOREGROUND"]

它首先啟動更新語句。 完成此操作(因此終止)之后,將調用apachectl以保持Web服務器運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM