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を完全にアンインストールするための詳細な手順

推薦する

MySQLサーバーが消えたエラーの解決策

PHP で MySQL サーバーが消えた問題1. 背景以前、Codeigniter でコンソール コ...

Docker クリーニングの一般的な方法と問題点

大規模な開発に Docker を使用する場合でも、クリーンアップ戦略がなければ、ディスクがすぐにいっ...

HTMLにおけるbackground-image属性の設定の詳細な説明

写真といえば、まず背景画像が思い浮かびます。私たちの装飾の多くは背景画像を使用して実現されているから...

WeChatアプレットが検索ボックス機能を実装

この記事の例では、WeChatアプレットの検索ボックス機能を実装するための具体的なコードを参考までに...

WeChatアプレットのスケルトン画面の実装例

目次スケルトンスクリーンとはアプレットでスケルトン画面を生成する方法導入方法表示と非表示ユーザーエク...

Redux Toolkit で Redux を簡素化する方法

目次Redux Toolkitが解決する問題何が含まれていますか? Redux Toolkit AP...

MySQLのネクストキーロックのロック範囲についての簡単な説明

序文ある日、突然 MySQL の次のキー ロックについて尋ねられ、私の即座の反応は次のようなものでし...

浮遊要素によって引き起こされる問題と解決策の詳細な説明

1. 問題複数のフローティング要素は親要素の幅を拡張できず、親要素の高さが 0 になる可能性がありま...

Dockerコマンドの自動補完の実装

序文この友人がどれくらいDockerを使っていなかったのかは分かりませんが、突然Dockerコマンド...

MySQLデータストレージプロセスパラメータの詳細な例

MySQL ストアド プロシージャ パラメータには、in、out、inout の 3 種類があります...

MySQL の日付と時刻の加算と減算のサンプル コード

目次1.MySQLは時間間隔を加算または減算します2. 日付を減算する最近、MySQL を見直してい...

WeChat パブリック アカウントの録音ファイルを再生して保存します (amr ファイルを mp3 に変換)

目次オーディオトランスコーディングツール原理JAVE プロジェクトの問題このプロジェクトの特徴拡張機...

判定条件を使用してCSSファイルをインポートする

解決策 1: HEAD に次のコードを挿入するなど、HTML ドキュメントで条件付きインポートを使用...

MySQL テーブル名の大文字と小文字の選択

目次1. 大文字と小文字の区別を決定するパラメータ2. パラメータ変更に関する注意事項要約: 1. ...

MySQLクエリ制御ステートメントの詳細なグラフィック説明

mysql クエリ制御ステートメントフィールド重複排除 **キーワード: 明確** 構文: テーブル...