Tôi đang cố gắng đặt tên máy chủ bên trong một vùng chứa docker trong quá trình xây dựng kể từ khi cài đặt phần mềm nhất định sử dụng tên máy chủ được tạo ngẫu nhiên và vĩnh viễn nướng tên máy chủ đó vào cấu hình.Dockerfile HOSTNAME Hướng dẫn cho docker build như docker run -h
Mặc dù có thể đặt tên máy chủ khi bạn chạy tương tác thông qua run -h, chức năng tương tự không khả dụng khi sử dụng xây dựng qua Dockerfile.
Cách duy nhất để giải quyết vấn đề này là sử dụng các lệnh hack LD_PRELOAD để tôi có thể đặt tên máy chủ thành localhost. Các hacks LD_PRELOAD có tác dụng phụ không mong muốn mà tôi gặp khó khăn khi làm việc xung quanh. Việc cài đặt phần mềm hoạt động không có vấn đề khi sử dụng "docker run -it -h localhost".
strace báo cáo rằng trình cài đặt thực hiện cuộc gọi để uname xác định tên máy chủ.
uname({sys="Linux", node="12b0c7c7eacb", ...}) = 0
Có ai biết cách có thể làm việc xung quanh giới hạn này không?
Cập nhật 1
Đây không phải là một bản sao của câu hỏi How to handle specific hostname like -h option in Dockerfile như đang nói cụ thể về "/ etc/hosts" vấn đề phát sinh từ tập tin đó được tự động tạo ra. Điều này là dễ dàng làm việc xung quanh vì nó là một tập tin có thể ghi.
Đây là về cài đặt phần mềm nhằm giải quyết tên máy chủ từ các cuộc gọi hệ thống như uname và gethostname. Từ những gì tôi có thể nói điều này không thể được làm việc xung quanh kể từ khi tên máy không thể thay đổi trong một container docker đang chạy. Hệ thống uname gọi khả năng tham chiếu/proc/sys/kernel/hostname, đây là chỉ đọc và không thể thay đổi. Thông thường lệnh hostname có thể chạy, nhưng lệnh này tạo ra một lỗi mà bạn phải root ngay cả khi bạn là root. Cách giải quyết cho việc này là sử dụng cờ -h, điều này không có sẵn trong các bản dựng.
Cập nhật 2
Đối với bất cứ ai tìm kiếm một workaround ở đây đó là, điều này chỉ cần được sử dụng trong Docker xây dựng, sử dụng cờ -h nếu bạn cần để tùy chỉnh hostname với Docker chạy. Điều này được dựa trên công việc của người khác.
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
..
C Nguồn:
#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 theo into_the_void như không có giải pháp cho vấn đề này.
Câu trả lời của tôi có giúp ích cho bạn không? http://stackoverflow.com/a/28922278/1220269 –
Cảm ơn bạn đã trả lời Nathaniel; Tôi nghĩ rằng câu trả lời của bạn là điều duy nhất tôi có thể tìm thấy trên internet về chủ đề này. Phần mềm tôi đang cài đặt sẽ xem tại/etc/hosts nhưng sử dụng lệnh gọi hệ thống chưa được nhận dạng để lấy được tên máy chủ. Tôi sẽ giữ cho giải pháp của bạn trong tâm trí trong tương lai. –
có thể trùng lặp của [Cách xử lý tên máy chủ cụ thể như -h tùy chọn trong Dockerfile] (http://stackoverflow.com/questions/28898787/how-to-handle-specific-hostname-like-h-option-in-dockerfile) –