首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在坞群服务中执行一个命令

在坞群服务中执行一个命令
EN

Stack Overflow用户
提问于 2016-09-07 06:12:29
回答 12查看 78.1K关注 0票数 65
  1. 初始化群模式: root@ip-172-31-44-207:/home/ubuntu# docker群集init --广告-addr 172.31.44.207群初始化:当前节点(4mj61oxcc8ulbd7zedxnz6ce)现在是一个管理器。若要将工作人员添加到此群中,请运行以下命令:
  2. 加入第二个节点: 码头群加入\-令牌SWMTKN-1-4xvddif3wf8tpzcg23tem3zlncth8460srbm7qtyx5qk3ton55-6g05kuek1jhs170d8fub83vs5 \ 172.31.44.207:2377

若要向该群中添加管理器,请运行“坞客群连接令牌管理器”并按照说明执行。

代码语言:javascript
复制
# start 2 services
docker service create continuumio/miniconda3 

docker service create --name redis redis:3.0.6


root@ip-172-31-44-207:/home/ubuntu# docker service ls
ID            NAME        REPLICAS  IMAGE                   COMMAND
2yc1xjmita67  miniconda3  0/1       continuumio/miniconda3
c3ptcf2q9zv2  redis       1/1       redis:3.0.6

如上面所示,redis有它的副本,而miniconda是而不是,似乎是复制的

我通常会登录到miniconda容器来输入以下命令:

代码语言:javascript
复制
/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser

问题是,docker exec -it XXX bash命令不适用于群集模式。

EN

回答 12

Stack Overflow用户

发布于 2018-08-24 12:56:18

您可以通过过滤容器名来执行命令,而不需要只通过服务名称传递整个群集容器哈希。如下所示:

docker exec $(docker ps -q -f name=servicename) ls

票数 59
EN

Stack Overflow用户

发布于 2017-03-22 15:20:55

有一个用于访问本地主机服务的相应实例的衬垫:

代码语言:javascript
复制
docker exec -ti stack_myservice.1.$(docker service ps -f 'name=stack_myservice.1' stack_myservice -q --no-trunc | head -n1) /bin/bash

它是在PowerShell上测试的,但是bash应该是相同的。oneliner访问第一个实例,但将'1‘替换为要在两个位置访问的实例的数量,以获得另一个实例。

更复杂的例子是分布式案例:

代码语言:javascript
复制
#! /bin/bash

set -e

exec_task=$1
exec_instance=$2

strindex() { 
  x="${1%%$2*}"
  [[ "$x" = "$1" ]] && echo -1 || echo "${#x}"
}

parse_node() {
  read title
  id_start=0
  name_start=`strindex "$title" NAME`
  image_start=`strindex "$title" IMAGE`
  node_start=`strindex "$title" NODE`
  dstate_start=`strindex "$title" DESIRED`
  id_length=name_start
  name_length=`expr $image_start - $name_start`
  node_length=`expr $dstate_start - $node_start`

  read line
  id=${line:$id_start:$id_length}
  name=${line:$name_start:$name_length}
  name=$(echo $name)
  node=${line:$node_start:$node_length}
  echo $name.$id
  echo $node
}

if true; then 
   read fn 
   docker_fullname=$fn
   read nn
   docker_node=$nn 
fi < <( docker service ps -f name=$exec_task.$exec_instance --no-trunc -f desired-state=running $exec_task | parse_node )

echo "Executing in $docker_node $docker_fullname" 

eval `docker-machine env $docker_node`

docker exec -ti $docker_fullname /bin/bash

稍后可以将此脚本用作:

代码语言:javascript
复制
swarm_bash stack_task 1

它只是在所需的节点上执行bash。

票数 44
EN

Stack Overflow用户

发布于 2016-09-07 08:15:55

编辑2017-10-06:

现在,您可以使用--attachable标志创建覆盖网络,以使任何容器都能够加入网络。这是一个很好的特性,因为它允许很大的灵活性。

例如。

代码语言:javascript
复制
$ docker network create --attachable --driver overlay my-network
$ docker service create --network my-network --name web --publish 80:80 nginx
$ docker run --network=my-network -ti alpine sh
(in alpine container) $  wget -qO- web

<!DOCTYPE html>
<html>
<head>
....

您是对的,您不能在码头群模式服务上运行docker exec。但是您仍然可以知道,哪个节点正在运行容器,然后直接在容器上运行exec。例如。

代码语言:javascript
复制
docker service ps miniconda3  # find out, which node is running the container
eval `docker-machine env <node name here>`
docker ps  # find out the container id of miniconda
docker exec -it <container id here> sh

在您的情况下,您必须首先了解为什么服务不能使miniconda容器正常运行。也许运行docker service ps miniconda3会显示一些有用的错误消息..?

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39362363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档