Могу ли я остановить контейнер докера по его открытому порту? - PullRequest
1 голос
/ 08 июля 2019

У меня около двух-шести проектов с докером на моем компьютере, которые я использую параллельно несколько раз, и мне приходится вручную останавливать некоторые контейнеры (mariadb, mongodb, php, nginx, apache) каждый раз, когда я хочу использовать другой проект. Есть ли способ остановить эти контейнеры по его порту, чтобы я мог просто сделать docker stop -p 3306 и добавить его в мой раздел Makefile stop? И если нет, то каким путем я должен пойти, чтобы оптимизировать этот рабочий процесс.

Я работаю на Mac с macOS 10.14.x и рабочим столом Docker v18.09.2.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Для тех, кто ищет способ использовать его в терминале в качестве псевдонима без вызова сценария или изменения пути PATH, в моем .zprofile есть сценарий @ b0gusb:

docker-stop() {
  local port=${1:-none} # set a default otherwise it will stop all
  for id in $(docker ps -q); do
    if [[ $(docker port "${id}") == *"${port}"* ]]; then
      echo "Stopping container ${id}"
      docker stop "${id}"
    fi
  done
}
alias stop=docker-stop

Обновление:

Я создал скрипт из вышеперечисленного, чтобы использовать его в моем .zprofile:

alias stop="bash ~/.zsh/docker-stop-by-port.sh"

докер-стоп-на-порт

#!/usr/bin/env bash

port=$1

RED='\033[0;91m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RESET='\033[0m'

echo "" # empty first line

if [ -z $port ]; then
  echo -e "  ${YELLOW}Please specify a port to a running docker container!${RESET}"
  exit 0
fi

port_is_number_regex='^[0-9]+$'
if ! [[ $port =~ $port_is_number_regex ]]; then
  echo -e "  ${RED}Port can only be of type number${RESET}" >&2
  exit 1
fi

num_results=0
no_results=0
SECONDS=0

for id in $(docker ps -q); do
  ((num_results += 1))
  if [[ $(docker port "${id}") == *"${port}"* ]]; then
    echo -e "  Stopping container ${GREEN}${id}${RESET}"
    fin_id=$(docker stop "${id}")

    if [ $fin_id == $id ]; then
      echo -e "  ${GREEN}Done${RESET} in ${SECONDS}s"
    fi
  else
    ((no_results += 1))
  fi
done

if [ $num_results -eq $no_results ]; then
  echo -e "  No running container found with port ${YELLOW}${port}${RESET}"
fi
0 голосов
/ 09 июля 2019

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

#!/usr/bin/env bash

for id in $(docker ps -q)
do
    if [[ $(docker port "${id}") == *"${1}"* ]]; then
        echo "stopping container ${id}"
        docker stop "${id}"
    fi
done

docker ps -q перечислит идентификаторы запущенных контейнеров.Если отображения портов содержат переданный аргумент, он останавливает контейнер.Поместите скрипт в PATH и вы можете выполнить его где угодно:

stopByPort.sh 3306
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...