2015-04-10 41 views
11

Tôi có một thùng chứa có chương trình đang chạy bên trong tomcat. Tôi chỉ cần thay đổi ngày trong vùng chứa này và kiểm tra hành vi chương trình của mình. Tôi có logic thời gian nhạy cảm, và đôi khi cần phải xem những gì sẽ xảy ra trong một vài ngày hoặc vài tháng sau đó. Có thể sử dụng docker không? Tôi đọc rằng nếu tôi thay đổi ngày trong container, ngày sẽ được thay đổi trên hệ thống máy chủ. Nhưng đó là một ý tưởng tồi với tôi. Tôi cần phải có một vài trường hợp của ứng dụng này trên một máy chủ và có khả năng thiết lập thời gian khác nhau cho mỗi trường hợp.Có thể thay đổi ngày trong thùng chứa docker không?

Nhưng khi tôi cố gắng để thay đổi ngày bên trong container Tôi nhận được lỗi:

sudo date 04101812 
date: cannot set date: Operation not permitted 
Fri Apr 10 18:12:00 UTC 2015 
+1

Bạn có thể thêm một chút mô tả về sự cố bạn gặp phải không? – abarisone

+1

nếu bạn cần thay đổi ngày trong ít hơn 24 giờ, hãy xem nhận xét của tôi http://stackoverflow.com/questions/29432395/creating-clock-skew-with-docker/29435396#29435396 – user2915097

+0

@abarisone tôi đã viết mô tả chi tiết hơn –

Trả lời

6

Đó là không thể với Docker. Docker sử dụng cùng một đồng hồ với hạt nhân bên ngoài. Những gì bạn cần là ảo hóa đầy đủ mô phỏng một PC hoàn chỉnh.

sudo không thành công vì nó chỉ làm cho bạn root môi trường ảo bên trong vùng chứa. Người dùng này không liên quan đến số thực root của hệ thống máy chủ (ngoại trừ tên và UID) và không thể thực hiện những gì root thực có thể thực hiện.

Khi bạn sử dụng ngôn ngữ cấp cao như Python hoặc Java, bạn thường có móc, nơi bạn có thể mô phỏng thời gian hệ thống nhất định để kiểm tra hoặc viết mã kết thúc tốt đẹp "lấy thời gian hiện tại từ hệ thống" và trả về bài kiểm tra của bạn .

-6

Có, tôi đã thử nghiệm và nó hoạt động!

sử dụng --privileged khi bạn runing hình ảnh của bạn

dụ:

docker run -i -t --rm --privileged my_image /bin/bash 
+2

Sử dụng công tắc --privileged tại đây sẽ gây ra lệnh từ container để ảnh hưởng đến host docker. Aso khác những điều xấu có thể xảy ra nếu bạn sử dụng --privileged mà không biết các hiệu ứng. – Myz

13

Nó là rất nhiều khả năng để tự động thay đổi thời gian trong một container Docker, mà không ảnh hưởng hệ điều hành máy chủ.

Giải pháp là giả mạo nó. This lib chặn tất cả các chương trình gọi hệ thống sử dụng để truy xuất ngày giờ hiện tại.

Việc triển khai thật dễ dàng. Thêm chức năng cho Dockerfile bạn nếu thích hợp:

WORKDIR/
RUN git clone https://github.com/wolfcw/libfaketime.git 
WORKDIR /libfaketime/src 
RUN make install 

Hãy nhớ để thiết lập các biến môi trường LD_PRELOAD trước khi bạn chạy các ứng dụng mà bạn muốn thời gian làm giả áp dụng cho.

Ví dụ:

CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000] 

Bạn bây giờ có thể tự động thay đổi thời gian máy chủ:

Ví dụ:

def set_time(request): 
    import os 
    print(datetime.today()) 
    os.environ["FAKETIME"] = "2020-01-01" # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d" 
    print(datetime.today()) 
+1

Thao tác này hoạt động bên trong vùng chứa Docker. Tôi docker exec'd trong cài đặt thư viện và sử dụng 'export' đặt các biến. – roman

+1

Giải pháp này cũng làm việc hoàn hảo cho tôi. Tôi đã làm những gì Roman gợi ý ở trên, nhập vào container, kiểm tra mã bằng cách sử dụng git, chạy make install, sau đó cam kết thay đổi của tôi cho hình ảnh, và khởi động lại container bằng cách sử dụng phương pháp sau đây 'docker run -it --rm [ tùy chọn bị bỏ qua] spooforbrains/image1/bin/bash -c "xuất LD_PRELOAD =/usr/local/lib/faketime/libfaketime.so.1; xuất FAKETIME_NO_CACHE = 1; xuất FAKETIME = \" 2016-05-01 12:00: 00 \ "; nút nodeimage" ' – SpooForBrains

+0

Phương thức này' def set_time (request): 'bạn định nghĩa cái này ở đâu? Bên trong Dockerfile? – chrismanderson

0

này làm việc cho tôi, có lẽ bạn có thể thử nó:

dpkg-reconfigure tzdata

Edit: Thực hiện nó bên trong container bạn đang gặp vấn đề. Giao diện sẽ xuất hiện. Ở đó bạn có thể chỉnh sửa múi giờ và giờ địa phương chẳng hạn, và thiết lập nó một cách chính xác, điều đó đã khắc phục được vấn đề của tôi, cũng giống như vấn đề của bạn.

Chúc may mắn!

+2

Bạn nên thêm giải thích cho câu trả lời. –

+0

xong, cảm ơn !!! – C4rlos96

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