Docker Compose tiếp tục chạy vùng chứa


94

Tôi muốn bắt đầu một dịch vụ với docker-soạn và giữ cho vùng chứa hoạt động để tôi có thể lấy địa chỉ IP của nó thông qua 'kiểm tra docker'. Tuy nhiên, thùng chứa luôn thoát ra ngay sau khi khởi động.

Tôi đã cố gắng thêm "command: [" sleep "," 60 "]" và những thứ khác vào docker-compos.yml nhưng bất cứ khi nào tôi thêm dòng có "command: ...", tôi không thể gọi "docker-compile up" vì tôi sẽ nhận được thông báo "Không thể bắt đầu vùng chứa ..... Lỗi hệ thống: ký tự không hợp lệ 'k' đang tìm đầu giá trị"

Tôi cũng đã thử thêm "CMD sleep 60" và whatnot vào Dockerfile nhưng các lệnh này dường như không được thực thi.

Có cách nào dễ dàng để giữ cho vùng chứa tồn tại hoặc để khắc phục một trong những sự cố của tôi không?

CHỈNH SỬA: Đây là tệp Soạn mà tôi muốn chạy:

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

Nó hoạt động tốt Nếu tôi bắt đầu điều này với trình soạn thảo trong hệ điều hành OS X, nhưng nếu tôi thử tương tự với Ubuntu 16.04, nó sẽ cho tôi thông báo lỗi ở trên.

Nếu tôi thử cách tiếp cận với Dockerfile, thì Dockerfile sẽ giống như sau:

FROM ubuntu:latest
CMD ["sleep", "60"]

Mà dường như không làm bất cứ điều gì

CHỈNH SỬA 2: Tôi phải tự sửa lỗi, hóa ra đó là vấn đề tương tự với Dockerfile và docker-compos.yml: Mỗi lần tôi thêm "CMD ..." vào Dockerfile HOẶC thêm "lệnh ..." vào tệp soạn thảo, tôi gặp lỗi ở trên với ký tự không hợp lệ. Nếu tôi loại bỏ cả hai lệnh, nó hoạt động hoàn hảo.


1
Vui lòng bao gồm docker-compos.yml, Dockerfile và bất kỳ tập lệnh nào bạn đang cố gắng gỡ lỗi.
BMitch

Một cuộc thảo luận liên quan, dành cho những người quan tâm: Phát triển quy trình làm việc cho máy chủ và máy khách bằng Docker Compose?
blong 19/08/17

Câu trả lời:


119

Để giữ cho vùng chứa hoạt động khi bạn khởi động nó docker-compose, hãy sử dụng lệnh sau

command: tail -F anything

Vì vậy, docker-compost.yml của bạn trở thành

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

và bạn có thể chạy một trình bao để vào vùng chứa bằng lệnh sau

docker exec -i -t composename_my-test_1 bash

đâu composenamelà tên thêm docker-composevào vùng chứa của bạn.


1
Làm thế nào để bạn dừng vùng chứa khi bạn đã hoàn thành nó? Có loại lệnh Ctrl + C, Ctrl + Z không? Ngay bây giờ tôi phải đóng thiết bị đầu cuối để thoát.
mac10688

Nếu bạn đang ở bên trong vùng chứa, bạn có thể nhập exitđể quay lại máy chủ của mình. Nếu bạn đang ở trên máy chủ của mình, thì bạn có thể dừng vùng chứa bằng Docker ( docker stop composename_my-test_1) hoặc Docker Compose ( docker-compose stop).
Nick Settje

2
@ Alexis.Rolland Nếu bạn sẵn sàng đặt một câu hỏi SO mới và chia sẻ thêm một số chi tiết, thì tôi rất sẵn lòng xem qua. Tôi đoán là lỗi của bạn có liên quan gì đó đến phần bên trong của một trong các vùng chứa của bạn, trái ngược với sự cố với Docker hoặc hệ điều hành máy chủ của bạn.
Nick Settje

1
@ mac10688 nếu không có lời nhắc trong phiên vùng chứa đính kèm của bạn thì hãy thử ctrl-d để tách
Stark

5
/dev/nullsẽ tốt hơn anythingcho lệnh đuôi ref. stackoverflow.com/a/48732671/248616
Nam G VU

80

Bạn có thể sử dụng ttytùy chọn cấu hình.

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

Lưu ý: Nếu bạn sử dụng Dockerfile cho hình ảnh và CMDtrong Dockerfile, tùy chọn này sẽ không hoạt động; tuy nhiên, bạn có thể sử dụng entrypointtùy chọn trong tệp soạn thảo để xóa tệp CMDkhỏi Dockerfile.


7
Điều này hoạt động và có vẻ ít hack hơn tail -f /dev/null. Với điều này, tôi có thể chạy môi trường nhà phát triển được chứa đựng với cơ sở dữ liệu postgres được đính kèm docker-compose upvà chạy trình bao thông qua một thiết bị đầu cuối khác bằng cách sử dụng docker exec.
Psiloc

1
Trong khi hiện tại KHÔNG được ghi chép đầy đủ. Đây là một tùy chọn chính thức sẽ đạt được hiệu quả tương tự như tail -f /dev/nullhoặc tail -f anything, xem tại đây: docs.docker.com/compose/compose-file
b01

2
@ABMRuman & Psiloc, Nó chỉ hoạt động khi bạn không sử dụng "lệnh" trong tệp docker-compost.yml. Khi sử dụng "lệnh", bạn cần một bản hack khác - do đó hack đuôi -F hoàn toàn phù hợp ở đây.
asafel

Đây phải là câu trả lời tốt nhất nếu bạn sử dụng entrypoint trong dockerfile.
DDKV587

53

Dựa trên nhận xét của @aanand trên GitHub ngày 26 tháng 8 năm 2015 , người ta có thể sử dụng tail -f /dev/nulltrong docker-compile để giữ cho vùng chứa hoạt động.

ví dụ về docker-compos.yml

version: '3'
services:
  some-app:
    command: tail -f /dev/null

Tại sao lệnh này?

Lý do duy nhất để chọn tùy chọn này là nó đã nhận được rất nhiều lượt thích trên GitHub, nhưng câu trả lời được bình chọn cao nhất không có nghĩa đó là câu trả lời hay nhất. Lý do thứ hai là một lý do thực dụng vì các vấn đề phải được giải quyết càng sớm càng tốt do thời hạn.


2
tại sao chính xác là lệnh này? Điều gì làm cho nó tốt hơn những người khác? Trong trường hợp của tôi chỉ mới bắt đầu một bash đã làm các trick cũng ...
N4ppeL

@ N4ppeL Câu hỏi hay. Lý do duy nhất tôi chọn tùy chọn này là nó đã nhận được rất nhiều lượt thích trên github, nhưng câu trả lời được bình chọn cao nhất không có nghĩa là nó là câu trả lời hay nhất. Lý do thứ hai là một lý do thực dụng vì tôi phải giải quyết vấn đề càng sớm càng tốt vì thời hạn.
030

17
  • Tạo một tệp có tên docker-compose.yml
  • Thêm phần sau vào tệp
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • Ở trong cùng một thư mục, chạy docker-compose up -dtừ thiết bị đầu cuối
  • Chạy docker psđể lấy id hoặc tên vùng chứa
  • Bạn có thể chạy docker inspect $container_id
  • Bạn có thể vào vùng chứa và chạy bash shell docker-compose exec ubuntu /bin/bashhoặcdocker-compose exec ubuntu /bin/sh
  • Khi hoàn tất, hãy đảm bảo rằng bạn đang ở bên ngoài vùng chứa và chạy docker-compose down

Đây là một tập lệnh bash nhỏ ( my-docker-shell.sh) để tạo tệp soạn docker, chạy vùng chứa, đăng nhập vào vùng chứa và cuối cùng là dọn dẹp vùng chứa docker và tệp soạn tin docker khi bạn đăng xuất.

#!/bin/bash

cat << 'EOF' > ./docker-compose.yml
---

version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    command: /bin/bash
    # tty: true

...
EOF

printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down

rm -v ./docker-compose.yml

1
Mặc dù đây không phải là câu trả lời thực tế cho câu hỏi, nhưng tôi thấy nó vô cùng có giá trị! Tôi đi xa hơn để sử dụng chức năng bashrc toàn cầu đối với phương pháp này: gist.github.com/loopmode/4d59a4e9a0a2ffacaec2dd14db4ae8bd
loopmode

8

Trong Dockerfile, bạn có thể sử dụng lệnh:

{CMD sleep infinity}

2

Như người bình luận đã nêu, chúng tôi phải xem Dockerfile được đề cập để cung cấp cho bạn câu trả lời đầy đủ, nhưng đây là một lỗi rất phổ biến. Tôi có thể đảm bảo khá nhiều rằng lệnh bạn đang cố chạy đang bắt đầu một quá trình nền. Đây có thể là lệnh bạn chạy trong các tình huống không phải Docker, nhưng đó là điều sai khi thực hiện trong Dockerfile. Ví dụ: nếu những gì bạn đang chạy thường được định nghĩa là một dịch vụ hệ thống, bạn có thể sử dụng một cái gì đó như "systemctl start". Điều đó sẽ bắt đầu quá trình trong nền, quá trình này sẽ không hoạt động. Bạn phải chạy quy trình ở phía trước, vì vậy toàn bộ quy trình sẽ bị chặn.


0

Chỉ cần một ghi chú nhanh

Tôi đã thử nghiệm dựa trên một hình ảnh duy nhất golang, vì vậy khi tôi gọi đến docker-compose downđây, những gì tôi nhận được:

version: "3.1"
...
command: tail -f /dev/null   # stopping container takes about 10 sec.
tty: true                    # stopping container takes about 2 sec.

Thông tin hệ thống của tôi:

Ubuntu 18.04.4 LTS (64-bit)
Docker version 19.03.6, build 369ce74a3c
docker-compose version 1.26.0, build d4451659

-3

Được rồi, tôi đã tìm ra sai lầm của mình. Trong Dockerfile cho hình ảnh được sử dụng để soạn thư, tôi đã chỉ định rằng hình ảnh cơ sở phải là ubuntu: mới nhất, nhưng trước đây tôi đã tự tạo một hình ảnh có tên ubuntu và hình ảnh đó không hoạt động. Vì vậy, tôi đã không sử dụng hình ảnh ubuntu gốc mà thay vào đó là một phiên bản bị hỏng của hình ảnh của chính tôi cũng được gọi là ubuntu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.