Chcę uruchomić usługę za pomocą docker-compose i utrzymać kontener w ruchu, abym mógł uzyskać jego adres IP przez „docker inspect”. Jednak kontener zawsze wychodzi zaraz po uruchomieniu.
Próbowałem dodać "command: [" sleep "," 60 "]" i inne rzeczy do docker-compose.yml, ale ilekroć dodam wiersz z "command: ..." Nie mogę wywołać "docker-compose up" ponieważ otrzymam komunikat „Nie można uruchomić kontenera ..... Błąd systemu: nieprawidłowy znak 'k' szukający początku wartości”
Próbowałem też dodać "CMD sleep 60" i inne rzeczy do samego Dockerfile, ale te polecenia nie wydają się być wykonywane.
Czy istnieje łatwy sposób na utrzymanie pojemnika przy życiu lub rozwiązanie jednego z moich problemów?
EDYCJA: Oto plik tworzenia, który chcę uruchomić:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
Działa dobrze Jeśli zacznę to od docker-compose pod OS X, ale jeśli spróbuję tego samego pod Ubuntu 16.04, pojawi się powyższy komunikat o błędzie.
Jeśli spróbuję podejścia z plikiem Dockerfile, plik Dockerfile wygląda następująco:
FROM ubuntu:latest
CMD ["sleep", "60"]
Co wydaje się nic nie robić
EDYCJA 2: Muszę się poprawić, okazało się, że to ten sam problem z plikiem Dockerfile i docker-compose.yml: Za każdym razem, gdy dodaję „CMD ...” do Dockerfile LUB dodaję „polecenie ...” do plik tworzenia, otrzymuję powyższy błąd z nieprawidłowym znakiem. Jeśli usunę oba polecenia, działa bezbłędnie.
źródło
Odpowiedzi:
Aby utrzymać kontener uruchomiony po uruchomieniu
docker-compose
, użyj następującego poleceniacommand: tail -F anything
Więc twój docker-compose.yml staje się
i możesz uruchomić powłokę, aby dostać się do kontenera, używając następującego polecenia
docker exec -i -t composename_my-test_1 bash
gdzie
composename
jest nazwadocker-compose
dodawana do twoich kontenerów.źródło
exit
aby wrócić do komputera głównego. Jeśli jesteś na swoim hoście, możesz zatrzymać kontener za pomocą Docker (docker stop composename_my-test_1
) lub Docker Compose (docker-compose stop
)./dev/null
byłoby lepiej na miejscu dlaanything
odniesienia ogona. stackoverflow.com/a/48732671/248616Możesz skorzystać z
tty
opcji konfiguracji.Uwaga: jeśli używasz Dockerfile dla obrazu i
CMD
Dockerfile, ta opcja nie będzie działać; jednak możesz użyćentrypoint
opcji w pliku redagowania, która czyści plikCMD
z Dockerfile.źródło
tail -f /dev/null
. Dzięki temu jestem w stanie uruchomić kontenerowane środowisko programistyczne z bazą danych postgres podłączoną za pośrednictwemdocker-compose up
i uruchomić powłokę za pośrednictwem innego terminala za pomocądocker exec
.tail -f /dev/null
lubtail -f anything
, patrz tutaj: docs.docker.com/compose/compose-fileOpierając się na komentarzu @aanand na GitHub 26 sierpnia 2015 r. , Można by użyć
tail -f /dev/null
w docker-compose, aby utrzymać działający kontener.Przykład docker-compose.yml
Dlaczego to polecenie?
Jedynym powodem wyboru tej opcji było to, że otrzymała ona wiele pozytywnych opinii na GitHubie, ale najwyższa odpowiedź nie oznacza, że jest to najlepsza odpowiedź. Drugi powód był pragmatyczny, ponieważ problemy musiały być rozwiązane jak najszybciej ze względu na terminy.
źródło
docker-compose.yml
docker-compose up -d
z terminaladocker ps
aby uzyskać identyfikator lub nazwę konteneradocker inspect $container_id
docker-compose exec ubuntu /bin/bash
lubdocker-compose exec ubuntu /bin/sh
docker-compose down
Oto mały skrypt bash (
my-docker-shell.sh
) służący do tworzenia pliku docker compose, uruchamiania kontenera, logowania do kontenera, a następnie czyszczenia kontenera docker i pliku redagowania docker po wylogowaniu.#!/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
źródło
W Dockerfile możesz użyć polecenia:
źródło
Jak stwierdził komentator, musielibyśmy zobaczyć dany plik Dockerfile, aby udzielić pełnej odpowiedzi, ale jest to bardzo częsty błąd. Mogę prawie zagwarantować, że polecenie, które próbujesz uruchomić, uruchamia proces w tle. Może to być polecenie, które można uruchomić w sytuacjach innych niż Docker, ale jest to niewłaściwa czynność w pliku Dockerfile. Na przykład, jeśli to, co uruchamiasz, jest zwykle definiowane jako usługa systemowa, możesz użyć czegoś takiego jak „systemctl start”. To uruchomiłoby proces w tle, co nie zadziała. Musisz uruchomić proces na pierwszym planie, więc cały proces zostanie zablokowany.
źródło
Tylko krótka notatka
Przetestowałem pojedynczy obraz na podstawie
golang
, więc kiedy dzwoniędocker-compose down
tutaj to co otrzymuję:Informacje o moim systemie:
źródło
Okej, znalazłem swój błąd. W pliku Dockerfile dla obrazu używanego do komponowania określiłem, że obraz podstawowy powinien być ubuntu: najnowszy, ale wcześniej utworzyłem samodzielnie obraz o nazwie ubuntu i ten obraz nie działa. Więc nie użyłem oryginalnego obrazu ubuntu, ale raczej uszkodzoną wersję mojego własnego obrazu, zwaną również ubuntu.
źródło