2015-03-06 19 views
12

Tôi đang sử dụng CentOS 7 làm máy chủ lưu trữ docker và centos: 6 Hình ảnh Docker.Cách xử lý tên máy chủ cụ thể như -h tùy chọn trong Dockerfile

Tôi muốn cài đặt một số phần mềm yêu cầu tên máy chủ có thể phân giải là địa chỉ không lặp lại. Nếu tôi chạy một hình ảnh Docker với tùy chọn -h như

docker run -i -t -h myhost centos:6 /bin/bash 

Sau đó, tôi có thể cài đặt phần mềm vì/etc/hosts trong container tự động cấu hình như

[[email protected] /]# cat /etc/hosts 
172.17.0.7 myhost 
127.0.0.1 localhost  

[[email protected] /]# ping myhost 
PING myhost (172.17.0.7) 56(84) bytes of data. 
64 bytes from myhost (172.17.0.7): icmp_seq=1 ttl=64 time=0.033 ms 

Nhưng tôi không thể sử dụng cùng một cách nếu tôi tạo một hình ảnh từ Dockerfile. Tôi đã thử nghiệm tạo ra một hình ảnh sử dụng sau Dockerfile

FROM centos:6 

ENV HOSTNAME myhost 
RUN ping myhost 

Trong Docker quá trình xây dựng, hostname giao không thể được giải quyết như addr ip động như sau:

$ docker build -t testimage . 
Sending build context to Docker daemon 2.048 kB 
Sending build context to Docker daemon 
Step 0 : FROM centos:6 
---> a30bc9f3097e 
Step 1 : ENV HOSTNAME myhost 
---> Using cache 
---> e73bf592389e 
Step 2 : RUN ping myhost 
---> Running in ca54c8eac073 
ping: unknown host myhost 
INFO[0000] The command [/bin/sh -c ping myhost] returned a non-zero code: 2 

Làm thế nào tôi có thể sử dụng một số tên máy cụ thể được giải quyết như container động IP addr?

Trả lời

6

Điều này thường không thể thực hiện được trong Dockerfile.

Tùy thuộc vào phần mềm, bạn có thể thực hiện một số loại công việc xung quanh. Ví dụ: bạn có thể thử một cái gì đó như

RUN echo $(grep $(hostname) /etc/hosts | cut -f1) my.host.name >> /etc/hosts && install-software 

Bằng cách đặt tên máy chủ trong cùng một lệnh RUN khi bạn cài đặt phần mềm, nó sẽ xảy ra bên trong cùng một lớp của vùng chứa. Docker sau đó sẽ ghi đè lên tên máy chủ và bạn sẽ phải thiết lập lại nó khi chạy, nhưng phần mềm của bạn có thể được chấp nhận với điều đó.

Nếu bạn phải thực hiện nhiều việc này, bạn có thể thử Packer để tạo vùng chứa. Nó có thể xây dựng các thùng chứa Docker, nhưng không sử dụng nhiều lớp. Điều này làm cho nó chậm hơn để xây dựng lại, nhanh hơn để tải xuống các hình ảnh đã được xây dựng, và làm cho nó thuận tiện hơn để thực hiện nhiều thao tác trên một hình ảnh trước khi đóng băng nó vào một thùng chứa.

+0

Cảm ơn! Đề xuất của bạn thực sự là một công việc xung quanh những gì tôi muốn. Tôi đã không nhận thấy rằng tôi có thể chỉnh sửa/etc/hosts nếu tôi không chỉ định tùy chọn -h, và có hiệu lực nếu tôi viết lệnh trong một bước RUN. Ngoài ra tôi sẽ xem xét sử dụng Packer sau khi dùng thử Dockerfile. – dempasong

1

Tôi nghĩ rằng đây là tốt hơn bởi vì container Docker thường không có 'hostname' cài đặt, do đó tôi sẽ sử dụng lệnh đầu:

echo $(head -1 /etc/hosts | cut -f1) $HOST_NAME >> /etc/hosts 
1

Gần đây tôi đã bắt đầu một dự án cho định tuyến các container bằng hostname, dự án đang ở giai đoạn alpha rất sớm, nhưng có lẽ nó có thể giúp ai đó đang tìm kiếm một số giải pháp định tuyến dễ dàng hơn mà không sử dụng các giải pháp nặng hơn hoặc chậm hơn khi dns phân giải hoặc phân phối giá trị khóa thông qua kết hợp swarm.

Đối với bất kỳ ai quan tâm hoặc sẵn sàng giúp repo có tại đây.

https://github.com/Markcial/yacht

0

Trong trường hợp khi /etc/hosts không được, tôi thay thế hostname nhị phân.

RUN mv /usr/bin/hostname{,.bkp}; \ 
    echo "echo myhost.local" > /usr/bin/hostname; \ 
    chmod +x /usr/bin/hostname 

... 

RUN mv /usr/bin/hostname{.bkp,} 
Các vấn đề liên quan