Как установить точку входа docker-compose / bin / bash? - PullRequest
0 голосов
/ 04 октября 2018

Я хотел бы войти в контейнер докера в интерактивном режиме с помощью запятой / bin / bash, используя только docker-compose.yml.Здесь похожий вопрос о переполнении стека: Интерактивная оболочка с использованием Docker Compose Ответы при условии, что там не работает.Вот как выглядит мой docker-compose.yml:

version: "3"
services:
  server:
    image: golang:1.11.1
    volumes:
      - './server:/go'
    ports:
      - '8080:8080'

    command: '-ti'
    entrypoint:
      - '/bin/bash'

Это моя консоль и вывод:

[bluebrown@firefly gowild]$ docker-compose up --build
Recreating gowild_server_1 ... done
Attaching to gowild_server_1
server_1  | bash: cannot set terminal process group (-1): Inappropriate ioctl for device
server_1  | bash: no job control in this shell
server_1  | root@d5884893075a:/go# exit
gowild_server_1 exited with code 0

docker-compose.yml and console

Читая вышеупомянутый пост, я попытался, конечно, также заменить:

command: '-ti'

на эти две строки:

stdin_open: true
tty: true

, но при выполнении этого docker compose застревает при подключении:

[bluebrown@firefly gowild]$ docker-compose up --build
Recreating gowild_server_1 ... done
Attaching to gowild_server_1

И дальше ничего не происходит.Нет ошибки и выхода, а также сообщение «Готово».

Try with substitued tty and stdin

При попытке сделать это с sh вместо bash, он говорит следующее дляcommand: '-it:

server_1  | /bin/sh: 0: Illegal option -t

А также застревает, как и bash, при подключении при его замене.

Обратите внимание, что я могу собрать и запустить сервер без команды и точки входа, просто используяследующее:

docker-compose up
docker-compose run --service-ports server

Тем не менее мой вопрос заключается в том, как сделать это с помощью docker-compose и точки входа, чтобы это можно было сделать только с docker-compose up.

Обновление: я использую Linuxmanjaro

1 Ответ

0 голосов
/ 18 октября 2018

Я думаю, что проблема здесь в том, что docker-compose может потенциально запускать несколько контейнеров ... поэтому он не может обычно подключаться к stdin конкретного контейнера.Ясно, что в вашем случае только с одним контейнером не должно быть путаницы, поэтому он может сделать это - но это изменит поведение, если вы позже добавите другой контейнер в yml, что может привести к путанице и, по сути,ошибка на этом этапе.

Так что .. compose не подходит для этой работы.

У меня есть небольшой скрипт bash dockersh, который позволяет легко попасть в оболочкулюбой образ докера:

#!/bin/sh

IMAGE=$1
shift

# sanitise the name a little
NAME=$(echo $IMAGE | tr '/:' '-')

# generate a random ID in case we have multiple running
ID=$(env LC_CTYPE=C tr -dc "a-z0-9" < /dev/urandom | head -c 10)

docker run --rm -ti \
  --name $NAME-$ID \
  -v $PWD:/mnt/$(basename $PWD) \
  -v $HOME/.ssh:/root/.ssh \
  $IMAGE \
  "$@"

Монтирование .ssh полезно для клонирования git-репозиториев и т. д. В linux вы могли бы сделать это, подключив $SSH_AUTH_SOCK в контейнер, но это не работает наMac (по крайней мере, для меня).

Для приведенного выше случая вы можете запустить как:

dockersh golang:1.11.1 bash

Хотя вы, возможно, захотите сделать это немного менее универсальным для себя, выставить порты и подключиться к /go и т. Д.

...