如何在Docker中生成映像期间执行脚本

如何在Docker中生成映像期间执行脚本,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我在我的Dockerfile末尾有以下内容: ENTRYPOINT bash -C '/usr/local/bin/setup_php_settings';'bash' 如果我没有记错的话,每次启动容器时都会执行/usr/local/bin/setup\u php\u settings。如果是这样的话,那么我在这个脚本中有一些安装内容(比如ZRay),我想转移到另一个脚本,比如说,在图像构建过程中只执行一次 setup\u php\u settings(不含ZRay部分)的内容如下: #!/b

我在我的
Dockerfile
末尾有以下内容:

ENTRYPOINT bash -C '/usr/local/bin/setup_php_settings';'bash'
如果我没有记错的话,每次启动容器时都会执行
/usr/local/bin/setup\u php\u settings
。如果是这样的话,那么我在这个脚本中有一些安装内容(比如ZRay),我想转移到另一个脚本,比如说,在图像构建过程中只执行一次

setup\u php\u settings
(不含ZRay部分)的内容如下:

#!/bin/bash -x
set -e

PHP_ERROR_REPORTING=${PHP_ERROR_REPORTING:-"E_ALL & ~E_DEPRECATED & ~E_NOTICE"}
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/apache2/php.ini
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/cli/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/apache2/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/cli/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/apache2/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/cli/php.ini

mkdir -p /data/tmp/php/uploads
mkdir -p /data/tmp/php/sessions
mkdir -p /data/tmp/php/xdebug
chown -R www-data:www-data /data/tmp/php*

ln -sf /etc/php5/mods-available/zz-php.ini /etc/php5/apache2/conf.d/zz-php.ini
ln -sf /etc/php5/mods-available/zz-php-directories.ini /etc/php5/apache2/conf.d/zz-php-directories.ini
ln -sf /usr/share/php/libzend-framework-php/Zend/ /usr/share/php/Zend
a2enmod rewrite
php5enmod mcrypt

# Apache gets grumpy about PID pre-existing files
: "${APACHE_PID_FILE:=${APACHE_RUN_DIR:=/var/run/apache2}/apache2.pid}"
rm -f "$APACHE_PID_FILE"

source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND "$@"

问题是,如何在映像构建期间执行这样的新脚本?使用
CMD
?任何其他解决方法?

正确的指令是
RUN
。这将在映像构建时运行脚本。就你而言—

RUN /usr/local/bin/setup_php_settings
CMD bash

没那么快,我已经添加了
setup\u php\u settings
文件的内容,也许你想重新检查你的答案:)我会说,根据你的答案,最好对安装内容使用一个单独的
运行
命令,你觉得怎么样?脚本中的所有步骤,除此之外,最后一行可能应该在映像构建期间运行(即单独的
run
命令)。最后一个看起来更像是我放在dockerfile中的
CMD
命令中的东西,尽管我会用dockerfile中的
ENV
命令替换
source
部分(假设此文件只设置了ENV vars)。好的,您可以添加一个可能的设置示例吗?抱歉,我还在学习Docker:)这是一个与“如何运行图像创建脚本”不同的问题。简单的回答是-运行2个容器,一个用于apache(您可以使用其官方图像),另一个用于php应用程序,并使用--link标志将它们链接在一起。这有点高级,但如果你想深入docker,我建议你从一开始就开始构建你的应用程序,为容器工作做好准备。