Linux 如何在终端管道请求中从docker容器名称的一部分获取和使用docker容器id?
我正在尝试组合以下命令:Linux 如何在终端管道请求中从docker容器名称的一部分获取和使用docker容器id?,linux,docker,grep,Linux,Docker,Grep,我正在尝试组合以下命令: docker ps | grep track 那会给我 6b86b28a27b0 dev/jobservice/worker-jobtracking:3.5.0-SNAPSHOT "/tini -- /startup/s…" 25 seconds ago Up 2 seconds (health: starting)
docker ps | grep track
那会给我
6b86b28a27b0 dev/jobservice/worker-jobtracking:3.5.0-SNAPSHOT "/tini -- /startup/s…" 25 seconds ago Up 2 seconds (health: starting)
jobservice_jobTrackingWorker_1
因此,我获取id并在下一个请求中使用它,如下所示:
docker logs 6b8 | grep -A 3 'info'
到目前为止,我能找到的最简单的方法是分别发送这些命令,但我想知道是否有一种简单的方法可以做到这一点
我认为这里的主要问题是,我试图根据容器名称的一部分来查找容器的名称
因此,为了继续,我想根据容器的名称查找并存储容器的id,然后使用它来查看其日志
谢谢 也许有更干净的方法,但这是可行的 要获取部分匹配的容器名称的ID,请执行以下操作:
$ docker ps --format "{{.ID}} {{.Names}}" | grep "partial" | cut -d " " -f1
然后可以在另一个bash命令中使用它:
$ docker logs $(docker ps --format "{{.ID}} {{.Names}}" | grep "partial" | cut -d " " -f1)
或者将其包装在函数中:
$ function dlog() { docker logs $(docker ps --format "{{.ID}} {{.Names}}" | grep "$1" | cut -d " " -f1); }
然后可以用作:
$ dlog partial
简而言之,实现您想要的目标的纯bash方法:
- 对于sudo:
sudo docker ps | grep -i track - | awk '{print $1}' | head -1 | xargs sudo docker logs
- 没有sudo:
docker ps | grep -i track - | awk '{print $1}' | head -1 | xargs docker logs
sudo docker ps | grep -i elixir -
sudo docker ps | grep -i elixir - | awk '{print $1}'
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1 | xargs sudo docker logs
输出:
0a19c6e305a2 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "iex -S mix phx.serv…" 7 days ago Up 7 days 127.0.0.1:2000-2001->2000-2001/tcp Projects_todo-tasks_app
65ef527065a8 exadra37/st3-3211-elixir:latest "bash" 7 days ago Up 7 days SUBL3_1600981599
232d8cfe04d5 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "mix phx.server" 8 days ago Up 8 days 127.0.0.1:4000-4001->4000-4001/tcp Staging_todo-tasks_app
0a19c6e305a2
65ef527065a8
232d8cfe04d5
0a19c6e305a2
[info] | module=WebIt.Live.Calendar.Socket function=mount/1 line=14 | Mount Calendar for date: 2020-09-30 23:29:38.229174Z
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=40 | Tzdata polling for update.
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=44 | Tzdata polling shows the loaded tz database is up to date.
现在让我们查找他们的ID:
命令:
sudo docker ps | grep -i elixir -
sudo docker ps | grep -i elixir - | awk '{print $1}'
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1 | xargs sudo docker logs
输出:
0a19c6e305a2 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "iex -S mix phx.serv…" 7 days ago Up 7 days 127.0.0.1:2000-2001->2000-2001/tcp Projects_todo-tasks_app
65ef527065a8 exadra37/st3-3211-elixir:latest "bash" 7 days ago Up 7 days SUBL3_1600981599
232d8cfe04d5 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "mix phx.server" 8 days ago Up 8 days 127.0.0.1:4000-4001->4000-4001/tcp Staging_todo-tasks_app
0a19c6e305a2
65ef527065a8
232d8cfe04d5
0a19c6e305a2
[info] | module=WebIt.Live.Calendar.Socket function=mount/1 line=14 | Mount Calendar for date: 2020-09-30 23:29:38.229174Z
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=40 | Tzdata polling for update.
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=44 | Tzdata polling shows the loaded tz database is up to date.
让我们获取第一个容器ID:
命令:
sudo docker ps | grep -i elixir -
sudo docker ps | grep -i elixir - | awk '{print $1}'
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1 | xargs sudo docker logs
注意:将头-1
替换为头-2
,以获得输出中的第二行
输出:
0a19c6e305a2 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "iex -S mix phx.serv…" 7 days ago Up 7 days 127.0.0.1:2000-2001->2000-2001/tcp Projects_todo-tasks_app
65ef527065a8 exadra37/st3-3211-elixir:latest "bash" 7 days ago Up 7 days SUBL3_1600981599
232d8cfe04d5 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "mix phx.server" 8 days ago Up 8 days 127.0.0.1:4000-4001->4000-4001/tcp Staging_todo-tasks_app
0a19c6e305a2
65ef527065a8
232d8cfe04d5
0a19c6e305a2
[info] | module=WebIt.Live.Calendar.Socket function=mount/1 line=14 | Mount Calendar for date: 2020-09-30 23:29:38.229174Z
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=40 | Tzdata polling for update.
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=44 | Tzdata polling shows the loaded tz database is up to date.
让我们看看列表中第一个容器的日志
命令:
sudo docker ps | grep -i elixir -
sudo docker ps | grep -i elixir - | awk '{print $1}'
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1
sudo docker ps | grep -i elixir - | awk '{print $1}' | head -1 | xargs sudo docker logs
注意:用tail-1
替换head-1
,以获取列表中最后一个容器的日志
输出:
0a19c6e305a2 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "iex -S mix phx.serv…" 7 days ago Up 7 days 127.0.0.1:2000-2001->2000-2001/tcp Projects_todo-tasks_app
65ef527065a8 exadra37/st3-3211-elixir:latest "bash" 7 days ago Up 7 days SUBL3_1600981599
232d8cfe04d5 exadra37/phoenix-dev:1.5.3_elixir-1.10.3_erlang-23.0.2_git "mix phx.server" 8 days ago Up 8 days 127.0.0.1:4000-4001->4000-4001/tcp Staging_todo-tasks_app
0a19c6e305a2
65ef527065a8
232d8cfe04d5
0a19c6e305a2
[info] | module=WebIt.Live.Calendar.Socket function=mount/1 line=14 | Mount Calendar for date: 2020-09-30 23:29:38.229174Z
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=40 | Tzdata polling for update.
[debug] | module=Tzdata.ReleaseUpdater function=poll_for_update/0 line=44 | Tzdata polling shows the loaded tz database is up to date.
结合不同的回复,我使用了:
function dlog(){docker ps | grep-i track-|awk'{print$1}}head-1 | xargs docker logs | grep-i-A 4“$2”}
为了两全其美。因此,我可以有一个函数,让我键入4个字母,而不是2个命令,并且不区分大小写
然后,我可以使用dlog关键字
获取日志
我硬编码了track和-a4,因为我通常使用该查询,但我可以将它们作为参数传递,以增加模块性(我的目标是非常简单)
谢谢你的帮助 工作得很好。需要注意的是--filter是区分大小写的,所以在我的例子中,我需要使用“Track”,而在docker ps|grep中,我也可以使用trackgreat。它消除了区分大小写的问题。如果我的答案有用的话,我会简单地删除sudo让它工作(我在Windows上),你可以投票给我。谢谢。嘿,我确实投票了,我可能还没有特权让他们出现,对不起,我希望投票否决我答案的用户能够解释我错在哪里。只有共享信息,我们才能相互学习:)这是Docker Compose托管容器吗?docker compose相当于使用compose服务名称的最有用的命令;您应该能够运行
docker compose logs jobTrackingWorker
。