Docker での環境変数の使用とよくある問題の解決策

Docker での環境変数の使用とよくある問題の解決策

序文

Docker はコンテナの環境変数を設定できます。設定方法は 2 つあります。

  • イメージを作成するときに、ENV コマンドを使用してイメージに環境変数を追加します。コンテナを起動するときにこの環境変数を使用します。
  • コンテナを起動すると、パラメータを通じて環境変数が設定されます。イメージ内に重複した環境変数がある場合は、イメージの環境変数が上書きされます。

コンテナ内で有効な環境変数を表示するにはdocker exec {containerID} envを使用します。

[root@localhost ~]# docker exec 984 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/default/bin
TERM=xterm
AUTHORIZED_KEYS=**なし**
JAVA_HOME=/usr/java/default
HOME=/ルート
...

コンテナによって開始されたプロセス、つまり ENTRYPOINT+CMD では、対応するシステム ライブラリを通じてコン​​テナの環境変数を取得できます。

コンテナに入り、プロセスの環境変数を表示します。/proc で表示できます。

cat /proc/{pid}/environ

そのため、コンテナ内のプロセス1の環境変数を参照することで、コンテナ内の環境変数も取得できます。 cat /proc/1/environ |tr '\0' '\n' コマンドを実行すると表示できます。

[root@localhost ~]# docker exec -it 984 cat /proc/1/environ |tr '\0' '\n'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/default/bin
TERM=xterm
AUTHORIZED_KEYS=**なし**
JAVA_HOME=/usr/java/default
HOME=/ルート
...

一般的に、親プロセスから生成された子プロセスは、デフォルトで親プロセスの環境変数を継承します。したがって、コンテナ内の各プロセスの環境変数はほぼ同じである必要があります。もちろん、特殊なケースでは環境変数もリセットされ、誤解や問題が生じることがあります。以下は、コンテナ内の一般的な状況の説明です。

よくある問題と解決策

別のユーザーに切り替えると環境変数が消える

コンテナでは、起動後に別のユーザーに切り替えます。たとえば、 su - adminを使用して管理者ユーザーに切り替えると、設定されたコンテナ環境変数が失われる場合があります。

これは、ユーザーを切り替えると環境変数がリセットされるためです。そのため、以前の環境変数を継承するには、 su -p adminの方法を使用する必要があります。

help を使用すると、su の関連パラメータの説明を表示できます。

[root@adworderp-03a38d62-4103555841-m81qk /]# su --help
使用法: su [OPTION]... [-] [USER [ARG]...]
有効なユーザー ID とグループ ID を USER のものに変更します。

...
 -m, --preserve-environment HOME、SHELL、USER、LOGNAME をリセットしない
    環境変数
 -p は -m と同じ
...

コンテナ内の文字化け

一部の企業がコンテナに移行すると、印刷されたログが文字化けすることが多いと報告されています。一般的な理由は、ロケールが正しく設定されていないことです。

現在のコンテナのロケールは locale を通じて表示できます。設定されていない場合は、通常は POSIX になります。 locale -a を使用すると、現在のコンテナでサポートされている言語環境を表示し、必要に応じて設定できます。

この問題を完全に解決したい場合は、コンテナまたはイメージを起動するときに環境変数に LANG={xxx} を追加し、適切な言語を選択して、それによって引き起こされるコード文字化けの問題を回避するのが最善の方法です。

ssh環境変数の問題

コンテナで sshd を有効にすると、接続とトラブルシューティングが容易になり、日常的な操作やメンテナンス操作も容易になります。

しかし、コンテナに入るユーザーの多くは、Docker の起動時に設定された環境変数が env コマンドでは正常に表示されないことに気づきます。

その主な理由は、ssh がユーザーの接続を確立すると環境変数がリセットされるためです。

これによって発生する最大の問題は、ssh 経由で開始されたコンテナ プロセスが、コンテナの起動時に設定された環境変数を取得できないことです。

原理を理解すれば、この問題を解決する簡単な方法があります。つまり、ssh 接続後のセッションにコンテナの環境変数をリセットすることができます。
具体的な実装方法は、ssh接続後にsource /etc/profileが自動的に実行されるというものです。

次に、/etc/profile に数行のコードを追加し、プロセス 1 からコンテナー自体の環境変数を取得し、ループで環境変数をエクスポートするだけです。

以下は単純な for ループの実装です。

`cat /proc/1/environ |tr '\0' '\n'` 内の項目について
する
 $item をエクスポートする
終わり

もちろん、より簡潔なコマンド、export $(cat /proc/1/environ |tr '\0' '\n' | xargs) もあり、同じ効果が得られます。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Dockerはターミナルで中国語を入力できない問題を解決します
  • Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策
  • DockerでJenkinsをインストールし、初期プラグインのインストール失敗の問題を解決する
  • Dockerコンテナが外部ネットワークにpingできない問題を解決する
  • Docker環境でJenkinsを設定すると、タスクをビルドするときにコンソールログに文字化けした中国語の文字が表示されます
  • docker ログが取得できない問題の解決方法
  • Ubuntu 19でdockerソースをインストールできない問題を共有する
  • Dockerに関するよくある質問

<<:  使用状況分析を備えたMySQL

>>:  CocosCreatorでJSZip圧縮を使用する方法

推薦する

Faint: 「Web2.0 を使用して標準に準拠したページを作成する」

今日、ある人がウェブサイト開発プロジェクトについて話をしてくれました。具体的な要件について話すと、「...

魔法のMySQLデッドロックトラブルシューティング記録

背景MySQL のデッドロックについて言えば、私は以前 MySQL のロックに関する基本的な紹介記事...

Node.js のフロントエンドとバックエンドのインタラクションによるユーザーログインの実装の実践

目次1. プロジェクト要件次にコーディングを始める1. フロントエンドページを作成する(CSSスタイ...

Vue.js での $emit の使用に関する詳細な説明

1. 親コンポーネントは props を使用して子コンポーネントにデータを渡すことができます。 2....

Nginx リバース プロキシと負荷分散の実践

リバースプロキシリバースプロキシとは、プロキシサーバーを介してユーザーのアクセス要求を受信し、ユーザ...

CentOS7 に MySQL データベースをインストールしてデバッグする詳細な手順 [例]

この例では、デバッグ用の MySQL データベースをダウンロードしてインストールする必要があります。...

vue3.0プロジェクトアーキテクチャを段階的に構築する方法を教えます

目次序文: 1. vue-cliでプロジェクトを作成する2. ルーターをインストールする3. ディレ...

JavaScriptは、ユーザーがチェックボックスをオンにする必要があるプロトコルの例を実装します。

js では、ログインまたは登録を確認する前に、ユーザーが特定の契約書を読むように設定します (使用...

Docker: /etc/default/docker の DOCKER_OPTS パラメータを変更しても反映されない

デフォルトでは、 /etc/default/docker 設定は有効になりません。docker 環境...

Django が uwsgi+nginx プロキシで静的リソースにアクセスできない問題の解決方法

uwsgi+nginx プロキシ Django をデプロイする場合、uwsgi を使用したアクセスは...

Linux SecureCRT の文字化けの解決方法

SecureCRT が文字化けした文字を表示する状況を見てみましょう。例えば: ではリセットしてみま...

axiosのシンプルなカプセル化と使用例コード

序文最近、プロジェクトを構築しているときに、リクエストのカプセル化について考え、どのようにカプセル化...

フィルターを使用して画像に透明な CSS を書く方法

フィルターを使用して画像に透明な CSS を書く方法コードをコピーコードは次のとおりです。 html...

MySQL セキュリティ管理の詳細

目次1. 順番に紹介する2. ユーザーを作成する3. ユーザーアカウントを削除する4. アクセス権5...

Vueナンバープレート検索コンポーネントの使い方の詳しい説明

参考までに、シンプルなナンバープレート入力コンポーネント(vue)です。具体的な内容は次のとおりです...