Dockerイメージでは、エントリポイントスクリプトからデータベース接続をpingするためにnetcatをインストールしないようにします。
/bin/sh
MOODLE_DB_HOST="xxxx"
MOODLE_DB_PORT=80
function pingdb {
OK=0
for count in {1..100}; do
echo "Pinging database attempt ${count} into ${MOODLE_DB_HOST}:${MOODLE_DB_PORT}"
if $(nc -z ${MOODLE_DB_HOST} ${MOODLE_DB_PORT}) ; then
echo "Can connect into database"
OK=1
break
fi
sleep 5
done
echo "Is ok? "$OK
if [ $OK -eq 1 ]; then
echo "Database type: "${MOODLE_DB_TYPE}
echo "DB Type: "${MOODLE_DB_TYPE}
else
echo >&2 "Can't connect into database"
exit 1
fi
}
nc
しかし、代わりにドッカーイメージで実行されるエントリポイントスクリプトの代わりにPHPを使用したいと思います。
他のオプションがありますか?
私がこれをやろうとしているのは、DebianベースとAlpineベースのDockerfileが2つあるからです。
DebianベースのPHP画像:
ARG PHP_VERSION="7.4"
FROM php:${PHP_VERSION}-fpm as base
RUN --mount=type=bind,from=mlocati/php-extension-installer:latest,source=/usr/bin/install-php-extensions,target=/usr/local/bin/install-php-extensions \
/usr/local/bin/install-php-extensions xmlrpc mbstring zip xml intl soap gd opcache &&\
echo "PHP_EXTENTION_DIR="$(php -i | grep extension_dir | cut -d " " -f 5) >> /etc/environment &&\
cat /etc/environment &&\
apt-get update &&\
apt-get install -y netcat &&\
apt-get autopurge -y &&\
apt-get autoremove -y &&\
apt-get autoclean &&\
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* cache/* /var/lib/log/* &&\
echo "max_input_vars=5000" > ${PHP_INI_DIR}/conf.d/moodle.ini
COPY ./scripts/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chown root:root /usr/local/bin/entrypoint.sh &&\
chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/bin/sh","/usr/local/bin/entrypoint.sh"]
CMD ["php-fpm"]
山の標準:
ARG PHP_VERSION="7.4"
FROM php:${PHP_VERSION}-fpm-alpine as base
RUN --mount=type=bind,from=mlocati/php-extension-installer:latest,source=/usr/bin/install-php-extensions,target=/usr/local/bin/install-php-extensions \
/usr/local/bin/install-php-extensions xmlrpc mbstring zip xml intl soap gd opcache &&\
apk update &&\
apk add netcat-openbsd &&\
rm -rf /var/cache/apk/* /var/tmp/* cache/* /var/lib/log/* &&\
echo "max_input_vars=5000" > ${PHP_INI_DIR}/conf.d/moodle.ini
COPY ./scripts/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chown root:root /usr/local/bin/entrypoint.sh &&\
chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/bin/sh","/usr/local/bin/entrypoint.sh"]
CMD ["php-fpm"]
場合によっては、パラメータによっては、PHP_VERSION
netcatインストール用のパッケージが存在するか存在しない場合があります(または別の名前で存在する場合があります)。また、ビルド時間apk add
がapt-get
大幅に増加します。
それでは代替案がありますか?
答え1
ここで:
function pingdb {
OK=0
for i in $(seq 1 100); do
echo "Pinging database attempt ${count} into ${MOODLE_DB_HOST}:${MOODLE_DB_PORT}"
if $(php -r "is_resource(@fsockopen(\"${MOODLE_DB_HOST}\",intval(\"${MOODLE_DB_PORT}\")))?exit(0):exit(1);") ; then
echo "Can connect into database"
OK=1
break
fi
sleep 5
done
if [ $OK -eq 1 ]; then
echo "Database type: "${MOODLE_DB_TYPE}
echo "DB Type: "${MOODLE_DB_TYPE}
else
echo >&2 "Can't connect into database"
exit 1
fi
}
ご覧のとおり、nc
次のものが置き換えられます。
php -r "is_resource(@fsockopen(\"${MOODLE_DB_HOST}\",intval(\"${MOODLE_DB_PORT}\")))?exit(0):exit(1);"
2つのパラメータが必要ですfsockopen
。
host
port
私がすることは、PHPでソケットを開いてソケットが開いていることを確認することです。その場合は0
ステータスコードで終了し、それ以外の場合は終了します1
。各パラメータはシェルスクリプトの文字列を使用して渡されるため、値をPHP文字列に変換するために"
文字を使用してエンコードします。\
varsを使用せずに次のことができます。
php -r "is_resource(@fsockopen(\"google.com",80)))?exit(0):exit(1);"
しかし、安全のためにbashパラメータを使用するバージョンのintvalを使用しました。