netcatを使用せずにonelinerコマンドを使用してシェルで接続を確認するにはどうすればよいですか?

netcatを使用せずにonelinerコマンドを使用してシェルで接続を確認するにはどうすればよいですか?

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_VERSIONnetcatインストール用のパッケージが存在するか存在しない場合があります(または別の名前で存在する場合があります)。また、ビルド時間apk addapt-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を使用しました。

関連情報