【问题标题】:How do I exec into a docker container using its image name (as opposed to container ID)?如何使用其图像名称(而不是容器 ID)执行到 docker 容器中?
【发布时间】:2021-10-16 16:45:42
【问题描述】:

我正在使用以下版本的 Docker

$ docker -v
Docker version 20.10.7, build f0df350

当我使用“docker-compose up”启动我的容器时,我可以看到它们都提出了

CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS                                       NAMES
29e94e032fbb   maps_apache     "httpd-foreground"       2 minutes ago   Up 2 minutes   0.0.0.0:9090->80/tcp, :::9090->80/tcp       maps_apache_1
13a8f2f037e4   maps_client     "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:3001->3000/tcp, :::3001->3000/tcp   web-app
318dff5311a2   maps_web        "bash /my-app/entryp…"   2 minutes ago   Up 2 minutes   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   maps_web_1
b4a6914cc67a   postgres:10.5   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:5105->5432/tcp, :::5105->5432/tcp   maps_postgres_1

我想使用可读的图像名称执行到我的 docker 容器中,所以我尝试了这个

$ docker exec -it maps_web sh
Error: No such container: maps_web

使用映像名称(而不是容器 ID)执行 docker 的正确方法是什么?

【问题讨论】:

  • 我们无法通过镜像名称执行到容器中。图像不是容器;多个容器可以使用相同的图像。因此,这可能不是一对一的映射。
  • 您是说“容器名称”吗?
  • 在 Docker-compose 文件中分配正确的容器名称。例如。将您的容器命名为maps_web。无需编写自定义 shell 脚本即可解决问题。
  • docker-compose exec web 将使用 Compose 服务名称,无需手动分配容器名称。
  • 感谢@David Maze。为了正式化我认为您所描述的内容,我运行了“docker-compose exec web sh”,这使我能够从容器内运行 shell 命令。

标签: docker docker-container docker-exec


【解决方案1】:

这是上述 cmets 中 docker-compose 建议的替代方案。

docker exec -it $(docker ps -aqf "name=maps_web_1") "sh"

$(docker ps -aqf "name=maps_web_1") 通过搜索名称来获取容器 ID(根据运行 docker ps 时最右列中的条目)。

您可以使用更具体的正则表达式模式,例如"name=maps_web.*"。这里需要注意的是,如果您不小心,这可能会返回多个容器 ID,或者根本不返回。

在您的情况下,$(docker ps -aqf "name=maps_web") 实际上会起作用,因为没有其他以 maps_web 为前缀的容器名称(它将使用找到的第一个容器名称)。

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2022-10-13
    • 2021-06-23
    相关资源
    最近更新 更多