nginxはdockerコンテナ内に設定ファイルを自動的に生成します

nginxはdockerコンテナ内に設定ファイルを自動的に生成します

企業が Docker 自動デプロイメントを構築する場合、Docker の実行時にコンテナ内の設定ファイルを変更することなく、外部から環境変数を指定してコンテナ内の設定ファイルが自動的に生成されるように、nginx イメージを作成する必要があります。

実装のアイデア

最終的に実行するコマンドはおそらく次のようになります。

docker run -d -p 80:80 -e xxx=xx イメージ名 イメージ内のスクリプトパス

ここでのスクリプトは dockerfile 内の CMD 命令を置き換えるため、nginx を自動的に生成して起動するシェル スクリプトを作成する必要があります。

#!/bin/bash

#環境変数から lt の先頭を取得して、他の環境変数と区別します。例: lt_analysis=172.17.0.1:8083
結果=""
$(env | grep ^lt) 内の a について
する
 OLD_IFS="$IFS"
 IFS="_"
 arr=($a)
 b=${arr[1]}
 IFS="="
 引数=($b)
 IFS="$OLD_IFS"
 結果="${結果}
  場所 /${arr[0]}/ {
    プロキシパス http://${arr[1]}/${arr[0]}/;
    プロキシ接続タイムアウト 90;
    プロキシ送信タイムアウト 90;
    プロキシ読み取りタイムアウト 90;
  }"
終わり
#nginx_conf設定ファイル内の変数 result を置き換えます
sed -i "s|nginx_conf|$(echo ${result})|g" /etc/nginx/nginx.conf
/usr/sbin にコピー
./nginx

説明する必要があるのは、ビジネスで構成ファイル全体を生成する必要がないということです。場所を生成し、元の構成ファイルでマークされた場所を置き換えることだけが必要です。以下は、元の構成ファイルでマークされた場所です。

http {
  ...
  
  サーバー{
    ...

    位置 / {
      ルートhtml;
      インデックス index.html index.htm;
    }

    nginx_conf

    #エラーページ 404 /404.html;
    ...

このシェルスクリプトとデフォルトの設定ファイルを nginx の dockerfile イメージに入れれば成功すると思ったのですが…上記コマンド実行後、コンテナが起動しませんでした。コンテナのログを確認すると、***Syntax error: “(” expected*** というメッセージが出てきました。私のシェルスクリプトはテスト済みで centos でも実行できるのですが、なぜこのエラーが報告されるのでしょうか?調べてみると、dockerfile は公式の nginx をベースイメージとして使っていることがわかりました。公式イメージは Ubuntu を使っていて、シェルスクリプトの実行に bash ではなく dash を使うようになっています。なんて落とし穴なんでしょう。仕方なく dockerfile を修正しました。以下はベースイメージ centos を使う場合です。

Centosより

環境変数 NGINX_VERSION 1.10.3
環境変数 OPENSSL_VERSION 1.0.2k
環境変数 PCRE_VERSION 8.40
環境変数 ZLIB_VERSION 1.2.11
環境変数 BUILD_ROOT /usr/local/xx/nginx

# 最終的に生成されるイメージが占めるスペースを減らすため、ここでは yum update コマンドは実行されませんが、これは良い方法ではないかもしれません。# ビルドを高速化するために、ここでは 163 インストール ソースが使用されます。# RUN yum -y update \
実行 yum -y install curl \
  && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
  && curl http://mirrors.163.com/.help/CentOS7-Base-163.repo -o /etc/yum.repos.d/CentOS7-Base-163.repo \ 
  && yum -y gcc をインストール gcc-c++ perl を zip で解凍 \
  && mkdir -p $BUILD_ROOT \
  && cd $BUILD_ROOT \
  && curl https://ftp.pcre.org/pub/pcre/pcre-$PCRE_VERSION.zip -o $BUILD_ROOT/pcre-$PCRE_VERSION.zip \
  && curl https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz -o $BUILD_ROOT/openssl-$OPENSSL_VERSION.tar.gz \
  && curl http://www.zlib.net/zlib-$ZLIB_VERSION.tar.gz -o $BUILD_ROOT/zlib-$ZLIB_VERSION.tar.gz \
  && curl https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o $BUILD_ROOT/nginx-$NGINX_VERSION.tar.gz \
  && tar vxzf nginx-$NGINX_VERSION.tar.gz \
  && pcre-$PCRE_VERSION.zip を解凍します \
  && tar vxfz zlib-$ZLIB_VERSION.tar.gz \
  && tar vxfz openssl-$OPENSSL_VERSION.tar.gz \
  && cd nginx-$NGINX_VERSION \
  && ビルド_CONFIG="\
    --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --http-client-body-temp-path=/var/cache/nginx/client_temp \
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    --with-openssl=$BUILD_ROOT/openssl-$OPENSSL_VERSION \
    --with-pcre=$BUILD_ROOT/pcre-$PCRE_VERSION \
    --with-zlib=$BUILD_ROOT/zlib-$ZLIB_VERSION \
    --http_ssl_module \ で始まる
    --http_v2_module \ で始まる 
    --スレッドあり\
    "\
  && mkdir -p /var/cache/nginx \
  && ./configure $BUILD_CONFIG \
  && メイク && メイク インストール \
  && rm -rf $BUILD_ROOT \
  && yum -y 削除 gcc gcc-c++ make perl zip unzip \
  && yum すべてをクリーン

#nginxのデフォルトファイルを置き換える COPY nginx.conf /etc/nginx/
#設定ファイルを自動的に生成するシェルスクリプトを追加します。COPY スクリプト名 /root/

#ポートを公開 EXPOSE 80 443

CMD ["nginx", "-g", "デーモンオフ;"]

注意: dockerコンテナはバックグラウンド操作をサポートしていません。コマンドが実行されると、コンテナは自然に終了します。ここでnginx設定ファイルを設定する必要があります。

#ユーザーnobody;
ワーカープロセス 1;

#error_log ログ/error.log;
#error_log ログ/error.log 通知;
#error_log ログ/error.log 情報;

#pid ログ/nginx.pid;
daemon off; //バックグラウンド実行イベントをオフにするにはここに追加します {
  ワーカー接続 1024;
}


http {

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker を使用して Nginx をインストールし、ポート転送の問題と解決策を構成する
  • DockerはNginxをデプロイし、リバースプロキシを構成する
  • Docker nginx + https サブドメイン設定の詳細なチュートリアル
  • docker に基づいて nginxssl 設定を開始する
  • Dockerでnginxをデプロイし、設定ファイルを変更する方法
  • Docker での nginx プラグインの設定とファイルの詳細な説明

<<:  時間範囲効果を実現するためのJavaScript

>>:  MySQL 5.7を完全にアンインストールするための詳細な手順

推薦する

CSS 極座標のサンプルコード

序文このプロジェクトには、衛星測位用のグラフィックスを含むチャートの要件があり、北半球または南半球の...

HTMLウェブページのMETAタグのコンテンツを書く際のポイント

META タグは、HTML 言語のヘッダー領域にある補助タグです。作成者、日時、Web ページの説明...

Vue.js のミックスインの詳細な説明

ミックスインは、コンポーネントに分散された再利用可能な機能を柔軟な方法で提供します。 Mixin オ...

div が iframe に覆われるいくつかの状況とその解決策

類似の構造:コードをコピーコードは次のとおりです。 <div></div>&...

MySQLサービスを削除する具体的な方法

MySQLは次のエラーを表示します「コントロール パネル -> 管理ツール -> サービ...

CSS テキスト配置実装コード

フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...

mysql5.7.14 解凍版インストールと設定方法 グラフィックチュートリアル (win10)

Win10はmysql5.7の解凍版をインストールします。参考までに、具体的な内容は次のとおりです...

デザインにおけるユーザーエクスペリエンスの背後にある8つのユーザー本能について話す

編集者注: この記事は、Teambition チームの @娄昊川 が寄稿したものです。Teambit...

JPQLに基づく純粋なSQL文方式の詳細な説明

JPQL は Java Persistence Query Language の略です。 Java ...

JavaScript が Jingdong の虫眼鏡効果を模倣

この記事では、Jingdongの虫眼鏡効果を実現するためのJavaScriptの具体的なコードを紹介...

ネイティブ js カスタム右クリック メニュー

この記事の例では、参考のためにjsカスタム右クリックメニューの具体的なコードを共有しています。具体的...

テーブルの追加と削除の操作を実装する js

この記事の例では、テーブルを追加および削除するためのjsの具体的なコードを参考までに共有しています。...

React Hooksの詳細な説明

目次フックとは何ですか?クラスコンポーネント機能コンポーネントフックが作られた理由要約するフックとは...

ウェブ上の模倣と盗作に関する議論

2005年に業界に入ってから数か月後、労働者の日休みの期間中、1か月以上毎日12時まで残業をしました...

HTML テーブルタグチュートリアル (12): 境界線スタイル属性 FRAME

FRAME プロパティを使用して、表の境界線のスタイル タイプを制御します。基本的な構文<T...