Shell 启动Docker容器并让容器运行时Excecute.sh文件
我有一个为Web服务器服务的docker容器。在每次启动容器时,我都想编写一个小shell脚本。必须执行的脚本只有一条语句Shell 启动Docker容器并让容器运行时Excecute.sh文件,shell,docker,startup,Shell,Docker,Startup,我有一个为Web服务器服务的docker容器。在每次启动容器时,我都想编写一个小shell脚本。必须执行的脚本只有一条语句 /var/www/html/app/Console/cake schema update -y 为了实现这一点,我创建了一个名为schemaupdate.sh的.sh文件,我使用dockerfile将该文件复制到/etc/init.d文件夹中的docker容器中。此外,我使其可执行,并将其注册到启动 COPY schemaupdate.sh /etc/init.d/sch
/var/www/html/app/Console/cake schema update -y
为了实现这一点,我创建了一个名为schemaupdate.sh
的.sh文件,我使用dockerfile将该文件复制到/etc/init.d
文件夹中的docker容器中。此外,我使其可执行,并将其注册到启动
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 init风格启动序列的成熟操作系统。他们只运行一个命令,就是这样
您应该在Dockerfile中以
RUN
语句的形式添加该命令,以便将其结果烘焙到图像中,或者您应该让容器的CMD
或ENTRYPOINT
指令直接调用该命令。我最终使用了ENTRYPOINT。我删除了副本、chmod和更新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服务器运行