我开始和Docker合作了。我正在使用WordPress的基本图像和docker合成。

我正在尝试ssh到其中一个容器中,以检查在初始构建期间创建的文件/目录。我试着运行docker compose运行containername ls-la,但没有任何效果。即使是这样,我也希望有一个控制台,在那里我可以遍历目录结构,而不是运行一个命令。使用Docker的正确方法是什么?


当前回答

在某些情况下,您的图像可以是基于阿尔卑斯山的。在这种情况下,它将抛出:

OCI运行时执行失败:执行失败:container_linux.go:348:启动容器进程导致“exec:\”bash\“:在中找不到可执行文件$PATH“:未知

因为/bin/bash不存在。相反,您应该使用:

docker exec -it 9f7d99aa6625 ash

or

docker exec -it 9f7d99aa6625 sh

其他回答

docker-attach将允许您连接到docker容器,但这实际上与ssh不同。例如,如果您的容器正在运行web服务器,docker附件可能会将您连接到web服务器进程的stdout。它不一定会给你一个外壳。

docker exec命令可能就是您所要的;这将允许您在现有容器中运行任意命令。例如:

docker exec -it <mycontainer> bash

当然,您正在运行的任何命令都必须存在于容器文件系统中。

在上面的命令中,<mycontainer>是目标容器的名称或ID。你是否使用docker compose并不重要;只需运行docker ps并使用ID(显示在第一列中的十六进制字符串)或名称(显示在最后一列中)。例如,给定:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

我可以跑:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

我可以通过跑步来完成同样的事情:

$ docker exec -it d2d4a89aaee9 ip addr

类似地,我可以在容器中启动一个shell;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

Use:

docker attach <container name/id here>

另一种方法(尽管有危险)是使用attach,但如果按Ctrl+C退出会话,也会停止容器。如果您只是想看看发生了什么,请使用docker-logs-f。

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)

要检查文件,请运行docker run-it<image>/bin/sh以获得交互式终端。图像列表可以通过docker图像获得。与docker exec相反,这种解决方案也适用于图像未启动(或运行后立即退出)的情况。

$ docker exec -it <Container-Id> /bin/bash

或者根据外壳

$ docker exec -it <Container-Id> /bin/sh

您可以通过docker ps命令获取容器Id

-i=交互式

-t=分配伪TTY

如果您正在使用Docker Compose,那么这将使您进入Docker容器。

docker-compose run container_name /bin/bash

在容器中,它会将您带到Dockerfile中定义的WORKDIR。您可以通过以下方式更改工作目录

WORKDIR directory_path # E.g  /usr/src -> container's path