Pythonは単にその情報を取得するためにuname
システムコールを呼び出します。これは常に現在実行中のカーネルに関する情報を返します。ソースを変更せずに戻り値をオーバーライドするのは難しいでしょう。
お客様は、機能の介入を使用してこれを実行します。記載の通りhere。これには、ラッパーライブラリーと必要な環境設定の両方を含むようにイメージを変更するか、Dockerの実行コマンド行にいくつかの追加パラメーターを渡す必要があります。
ここに簡単な例があります。私はバニラのイメージで開始し、Pythonでos.uname()
を呼び出す:
$ docker run -it --rm fedora python3
Python 3.6.2 (default, Sep 1 2017, 12:03:48)
[GCC 7.1.1 20170802 (Red Hat 7.1.1-7)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.uname()
posix.uname_result(sysname='Linux', nodename='fd2d40cb028b', release='4.13.15-100.fc25.x86_64', version='#1 SMP Tue Nov 21 22:45:32 UTC 2017', machine='x86_64')
>>>
私が代わりに1.0.0
を表示するrelease
フィールドをしたいと思います。私はuname
システムコールのラッパーを作成することから始め:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>
#include <sys/utsname.h>
/* Function pointers to hold the value of the glibc functions */
static int (*real_uname)(struct utsname *name) = NULL;
/* wrapping write function call */
int uname(struct utsname *name) {
int res;
real_uname = dlsym(RTLD_NEXT, "uname");
res = real_uname(name);
if (res == 0) {
memset(name->release, 0, _UTSNAME_RELEASE_LENGTH);
strncpy(name->release, "1.0.0", 5);
}
return res;
}
そして私は、共有ライブラリのコンパイル:
$ gcc -fPIC -shared -o wrap_uname.so wrap_uname.c -ldl
は、今私はドッキングウィンドウのイメージにそれを注入し、共有ライブラリをプリロードすることができます。キーの追加は、リンカがそれをプリロードさせるライブラリと
-e LD_PRELOAD
を注入する
-v
されている。
$ docker run -it --rm \
-v $PWD/wrap_uname.so:/lib/wrap_uname.so \
-e LD_PRELOAD=/lib/wrap_uname.so fedora python3
そして、あなたが見ることができるように、私たちに望ましい結果与えること:
Python 3.6.2 (default, Sep 1 2017, 12:03:48)
[GCC 7.1.1 20170802 (Red Hat 7.1.1-7)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.uname()
posix.uname_result(sysname='Linux', nodename='dd88d697fb65', release='1.0.0', version='#1 SMP Tue Nov 21 22:45:32 UTC 2017', machine='x86_64')
>>>
なぜディストリビューションを検出してスクリプトを実行するbashスクリプトを使用しますか?あなたがそれに興味があるなら私は答えを書くことができます;-) –
残念ながら、unameの周りのラッパースクリプトはそれを(私が説明したように)カットするつもりはありません。あなたが別のアプローチを意味していない限り。いずれにせよ、私は@ larsksが提供したソリューションが本当に好きです。 –