2015-03-19 19 views
5

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.

+0

Câu trả lời của tôi có giúp ích cho bạn không? http://stackoverflow.com/a/28922278/1220269 –

+0

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. –

+0

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) –

Trả lời

1

Hãy để tôi biết nếu tôi hiểu câu hỏi của bạn, bạn muốn xây dựng hình ảnh khi chạy dưới dạng vùng chứa có tên máy chủ lưu trữ ngay cả khi tên máy chủ được sử dụng để xây dựng không giống nhau. Chính xác? Nếu vậy, câu hỏi của tôi cho bạn là như sau, bạn có thể cấu hình lại phần mềm để có một tên máy chủ mới sau khi nó được cài đặt không?

Nếu điều này có thể, tôi khuyên bạn nên viết một tập lệnh có thể sửa đổi tên máy chủ và sử dụng tập lệnh này làm ENTRYPOINT. Bằng cách này, bạn có thể đảm bảo rằng bạn đã sửa chữa tên máy chủ bất cứ khi nào vùng chứa của bạn chạy (với bất kỳ lệnh nào) và bạn không dành thời gian cố gắng hỗ trợ cho một tên máy chủ cụ thể trong thời gian xây dựng. làm.

+0

Đây là một gợi ý tuyệt vời, tập lệnh nhập cảnh là những gì chúng tôi làm cho tất cả hình ảnh docker của chúng tôi. Thật không may phần mềm này cấu hình tên máy chủ trong khoảng 60 địa điểm, từ tệp văn bản, tệp xml và tệp nhị phân bên trong. Phương pháp được đề xuất của thay đổi tên máy chủ có nghĩa là cài đặt lại phần mềm cộng với một số bước bổ sung. Điều này có nghĩa là thời gian khởi động điểm vào sẽ tăng từ 2 phút lên khoảng 40 phút mà không khả thi. –

+1

Vâng, có thể đã đến lúc thử trình theo dõi vấn đề (http://github.com/docker/docker/issues) vì tôi không tin rằng chức năng này tồn tại hoặc ít nhất cũng không gặp phải vấn đề này. - into_the_void 55 phút trước – jakirkham

+0

Cảm ơn bạn vì thông tin này, tôi nghĩ rằng đây là câu trả lời đúng. –

Các vấn đề liên quan