gpt4 book ai didi

Dockerfile HOSTNAME docker build 指令,如 docker run -h

转载 作者:行者123 更新时间:2023-12-04 20:39:33 24 4
gpt4 key购买 nike

我试图在构建期间在 docker 容器内设置主机名,因为某些软件安装使用发现的随机生成的主机名并将该主机名永久地烘焙到配置中。

虽然可以在通过 run -h 交互运行时设置主机名,但使用通过 Dockerfile 构建时无法使用相同的功能。

解决此问题的唯一方法是使用 LD_PRELOAD hacks,以便我可以将主机名设置为 localhost。 LD_PRELOAD 黑客有我无法解决的不必要的副作用。使用“docker run -it -h localhost”时,软件安装工作没有问题。

strace 报告安装程序调用 uname 来确定主机名。

uname({sys="Linux", node="12b0c7c7eacb", ...}) = 0

有谁知道如何解决这个限制?

更新 1

这不是问题 How to handle specific hostname like -h option in Dockerfile 的重复因为那是专门讨论由动态生成的文件引起的“/etc/hosts”问题。这很容易解决,因为它是一个可写文件。

这是关于尝试从系统调用(例如 uname 和 gethostname)解析主机名的软件安装。据我所知,这是无法解决的,因为无法在正在运行的 docker 容器中更改主机名。 uname 系统调用可能引用/proc/sys/kernel/hostname,这是只读的,不能更改。通常可以运行 hostname 命令,但是此命令会生成一个错误,即使您是 root,您也必须是 root。解决方法是使用 -h 标志,这在构建中不可用。

更新 2

对于在这里寻找解决方法的任何人来说,这只需要在 docker 构建期间使用,如果您需要使用 docker run 自定义主机名,请使用 -h 标志。这是基于别人的工作。

Dockerfile:
RUN gcc -o fakehostname.o -c -fPIC -Wall fakehostname.c
RUN gcc -o libfakehostname.so -shared -W1,export-dynamic fakehostname.o -ldl

RUN ..
export LD_PRELOAD=/u01/app/oracle/libfakehostname.so;\
installer section
..

来源:
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/utsname.h>

#include <stdio.h>
#include <string.h>

static int (*real_gethostname)(char *name, size_t len);

int uname(struct utsname *buf)
{
int ret;

ret = syscall(SYS_uname, buf);

strcpy(buf->nodename, "localhost");

return ret;
}

int gethostname(char *name, size_t len)
{
const char *val;

/* Override hostname */
val = "localhost";
if (val != NULL)
{
strncpy(name, val, len);
return 0;
}

/* Call real gethostname() */
return real_gethostname(name, len);
}

http://github.com/docker/docker/issues按照 into_the_void 因为这个问题没有解决办法。

最佳答案

让我看看我是否理解你的问题,你想构建一个镜像,当作为容器运行时,它具有运行时主机名,即使用于构建的主机名不同。正确的?如果是这样,我对您的问题如下,您是否能够在安装后重新配置软件以使用新的主机名?

如果可能的话,我建议编写一个能够修改主机名的脚本并将此脚本用作 ENTRYPOINT .通过这种方式,您可以保证在运行容器时(使用任何命令)更正主机名,并且您不会花时间试图在构建时强制支持特定主机名,您自己承认这很困难去做。

关于Dockerfile HOSTNAME docker build 指令,如 docker run -h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29157013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com