2017-01-01 24 views
7

Trong khi cố gắng gỡ lỗi một câu lệnh RUN trong Dockerfile của tôi, tôi đã cố chuyển hướng đầu ra tới một tệp có khối lượng giới hạn (./mongo/log).Docker: RUN touch không tạo tập tin

Tôi ngạc nhiên khi không thể tạo tệp qua lệnh RUN hoặc để kết nối đầu ra của lệnh khác thành tệp bằng cách sử dụng toán tử chuyển hướng/nối (>, >>). Tuy nhiên tôi đã có thể thực hiện nhiệm vụ đã nói bằng cách đăng nhập vào thùng chứa đang chạy qua docker exec -ti mycontainer /bin/sh và phát lệnh từ đó.

Tại sao hành vi này lại xảy ra? Làm thế nào tôi có thể chạm vào tập tin trong đầu ra Dockerfile/chuyển hướng đến một tập tin hoặc giao diện điều khiển mà từ đó Dockerfile được chạy?

Đây là Dockerfile tôi:

FROM mongo:3.4 

#Installing NodeJS 
    RUN apt-get update && \ 
    apt-get install -y curl && \ 
    curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ 
    apt-get install -y nodejs 


#Setting Up Mongo 
    WORKDIR /var/www/smq 
    COPY ./mongo-setup.js mongo-setup.js 

    ##for testing 
    RUN touch /var/log/node.log &&/
     node --help 2>&1 > /var/log/node.log 

    ##this was the command to debug 
    #RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log 

Dưới đây là một đoạn trích từ tôi Docker-compose.yml:

mongodb: 
    build: 
     context: ./ 
     dockerfile: ./mongodb-dockerfile 
    container_name: smqmongodb 
    volumes: 
    - /var/lib/mongodb/data 
    - ./mongo/log/:/var/log/ 
    - ../.config:/var/www/.config 
+0

Bạn nên đọc về các bước xây dựng bộ đệm đệm trung gian: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/. Nó hoạt động chính xác vì nó được thiết kế để hoạt động - dường như bạn muốn nó hoạt động theo một cách khác. Mặc dù có thể nói docker không sử dụng bộ nhớ đệm (với '--no-cache = true', như bạn có thể tìm hiểu trong liên kết ở trên), tôi khuyên bạn nên xem lại cách tạo Dockerfile để nắm bắt và tận dụng khả năng bộ nhớ đệm. –

+0

Đọc thú vị! Hãy để tôi cập nhật Dockerfile của tôi. Từ đọc nhanh của tôi nó dường như không giải quyết được vấn đề của tôi, phải không? –

+0

@Phillipe - tham số tôi đã đề cập * nên * giải quyết vấn đề - nó sẽ vô hiệu hóa bộ nhớ đệm, do đó, "chạm" sẽ chạy trên mọi bản dựng. Nhưng có thể có những cách khác mà bạn có thể đạt được mục tiêu của mình mà không phải tắt bộ nhớ cache ... –

Trả lời

4

Thay vì RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log, trong container, những gì nếu bạn chỉ nói `nút RUN mongo-setup.js '?

Đế đề nghị sử dụng docker logs. Cũng giống như vậy:

docker logs container-name 

Để thực hiện những gì bạn đang sau (xem các bản ghi cài đặt Mongo?), Bạn có thể chia stderr stdout & của container bằng đường ống dòng riêng biệt: và gửi chúng đến tập tin:

[email protected]~$ docker logs foo > stdout.log 2>stderr.log 

[email protected]~$ cat stdout.log 
[email protected]~$ cat stderr.log 

Ngoài ra, hãy tham khảo docker logs documentation

+1

Thú vị, tôi sẽ thực hiện một số nghiên cứu về cách có thể đạt được điều này với docker-compose (và cách các bản ghi docker hoạt động) và tôi sẽ đăng kết quả của mình ở đây. –

+0

Sau một số nghiên cứu, tôi đã tìm thấy bài viết hay này mô tả trong tổng quan cách đăng nhập diễn ra trong docker: https://medium.com/@yoanis_gil/logging-with-docker-part-1-b23ef1443aac#.q7macfaym Bây giờ tôi thấy docker chiến lược về docking. Tuyệt vời để biết! –

+0

Trong khi tôi đã thiết lập tùy chọn ghi nhật kí hệ thống nhật ký, vì một số lý do tôi bắt đầu có một số bản in từ lệnh bị lỗi (nút mongo-setup.js). Vì vậy, bây giờ tôi có một syslog sẵn sàng để đi bất cứ khi nào tôi muốn sử dụng một hệ thống đăng nhập như vậy, và lệnh của tôi in ra giao diện điều khiển khác. Cảm ơn một lần nữa vì câu trả lời của bạn :) –

7

bạn đang làm điều này trong quá trình xây dựng của bạn:

RUN touch /var/log/node.log &&/
    node --help 2>&1 > /var/log/node.log 

Tệp /var/log/node.log được tạo và sửa cố định thành hình ảnh kết quả.

Sau đó, bạn chạy container với khối lượng này gắn kết:

volumes: 
    - ./mongo/log/:/var/log/ 

Dù là trong ./mongo/log/ được gắn kết như là /var/log trong container, mà giấu bất cứ điều gì đã có trước (từ hình ảnh). Đây là điều làm cho nó trông giống như touch của bạn đã không hoạt động (mặc dù nó có thể làm việc tốt).

Bạn đang suy nghĩ về điều này lạc hậu - ổ đĩa âm lượng của bạn không lộ phiên bản của container /var/log bên ngoài - nó thay thế bất cứ điều gì đã có.

Không có gì bạn làm trong Dockerfile (bản dựng) sẽ hiển thị trong một gắn ngoài.

+0

Câu trả lời của bạn là một ah-ha! chốc lát. Lời giải thích tuyệt vời. Rõ ràng, súc tích và cho vấn đề. Bây giờ tôi hiểu những gì @Bruno Reis có nghĩa là trong bình luận của mình theo OP. Cuối cùng vì câu trả lời của Socratees cung cấp giải pháp cho vấn đề đăng nhập của tôi, tôi sẽ coi ông là giải pháp được chấp nhận. Tuy nhiên câu trả lời của bạn chỉ là thông tin và có giá trị. Chúc mừng! –

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