如何设置 docker-compose /bin/bash 入口点?
How to set a docker-compose /bin/bash entrypoint?
我想使用 docker-compose.yml 在交互模式下使用命令 /bin/bash 进入 docker 容器。这里有一个关于堆栈溢出的类似问题:Interactive shell using Docker Compose
那里提供的答案无效。这是我的 docker-compose.yml 的样子:
version: "3"
services:
server:
image: golang:1.11.1
volumes:
- './server:/go'
ports:
- '8080:8080'
command: '-ti'
entrypoint:
- '/bin/bash'
这是我的控制台输入和输出:
[bluebrown@firefly gowild]$ docker-compose up --build
Recreating gowild_server_1 ... done
Attaching to gowild_server_1
server_1 | bash: cannot set terminal process group (-1): Inappropriate ioctl for device
server_1 | bash: no job control in this shell
server_1 | root@d5884893075a:/go# exit
gowild_server_1 exited with code 0
阅读上面提到的 post 我当然也尝试替代:
command: '-ti'
对于这两行:
stdin_open: true
tty: true
但是在执行此操作时 docker compose 在附加时卡住了:
[bluebrown@firefly gowild]$ docker-compose up --build
Recreating gowild_server_1 ... done
Attaching to gowild_server_1
然后什么也没发生。没有错误和退出,也没有 'done' 消息。
当尝试使用 sh
而不是 bash
时,它对 command: '-it
表示以下内容:
server_1 | /bin/sh: 0: Illegal option -t
并且在替换时也会像 bash 一样卡住。
请注意,我可以构建和 运行 服务器而无需命令和入口点,只需使用以下命令:
docker-compose up
docker-compose run --service-ports server
我的问题仍然是如何使用 docker-compose 和一个入口点来完成它,所以它只能用 docker-compose up
来完成。
更新:我正在使用 Linux manjaro
我认为这里的问题是 docker-compose 可能 运行 多个容器.. 所以它通常不能附加到特定容器的标准输入。显然,在你只有一个容器的情况下,应该没有混淆,所以它 可以 这样做 - 但如果你稍后将另一个容器添加到 yml,这将改变行为,这将是当时令人困惑,本质上是一个错误。
所以 ..compose 不是这项工作的正确工具。
我有一个名为 dockersh
的小 bash 脚本,它可以很容易地放入任何 docker 图像的 shell 中:
#!/bin/sh
IMAGE=
shift
# sanitise the name a little
NAME=$(echo $IMAGE | tr '/:' '-')
# generate a random ID in case we have multiple running
ID=$(env LC_CTYPE=C tr -dc "a-z0-9" < /dev/urandom | head -c 10)
docker run --rm -ti \
--name $NAME-$ID \
-v $PWD:/mnt/$(basename $PWD) \
-v $HOME/.ssh:/root/.ssh \
$IMAGE \
"$@"
.ssh
挂载对于克隆 git 存储库等很有用。在 linux 上,您也可以通过将 $SSH_AUTH_SOCK
挂载到容器中来实现,但这并不在 mac 上工作(至少对我而言)。
对于上述情况,您可以 运行 为:
dockersh golang:1.11.1 bash
虽然您可能想让它对您自己来说不那么通用,并公开端口并挂载到 /go
等
在那个特定的用例中,解决方案应该如下所示。这样做的原因通常是 /bin/bash 与 -ti
一起使用以在容器内输入 shell。
通过对特定服务使用 运行 命令,可以使用 compose 完成同样的事情。请注意,我也公开了服务端口。
docker-compose run --service-ports server bash
https://docs.docker.com/compose/reference/run/
如果容器已经 运行ning 那么 exec
应该足够了。
我想使用 docker-compose.yml 在交互模式下使用命令 /bin/bash 进入 docker 容器。这里有一个关于堆栈溢出的类似问题:Interactive shell using Docker Compose 那里提供的答案无效。这是我的 docker-compose.yml 的样子:
version: "3"
services:
server:
image: golang:1.11.1
volumes:
- './server:/go'
ports:
- '8080:8080'
command: '-ti'
entrypoint:
- '/bin/bash'
这是我的控制台输入和输出:
[bluebrown@firefly gowild]$ docker-compose up --build
Recreating gowild_server_1 ... done
Attaching to gowild_server_1
server_1 | bash: cannot set terminal process group (-1): Inappropriate ioctl for device
server_1 | bash: no job control in this shell
server_1 | root@d5884893075a:/go# exit
gowild_server_1 exited with code 0
阅读上面提到的 post 我当然也尝试替代:
command: '-ti'
对于这两行:
stdin_open: true
tty: true
但是在执行此操作时 docker compose 在附加时卡住了:
[bluebrown@firefly gowild]$ docker-compose up --build
Recreating gowild_server_1 ... done
Attaching to gowild_server_1
然后什么也没发生。没有错误和退出,也没有 'done' 消息。
当尝试使用 sh
而不是 bash
时,它对 command: '-it
表示以下内容:
server_1 | /bin/sh: 0: Illegal option -t
并且在替换时也会像 bash 一样卡住。
请注意,我可以构建和 运行 服务器而无需命令和入口点,只需使用以下命令:
docker-compose up
docker-compose run --service-ports server
我的问题仍然是如何使用 docker-compose 和一个入口点来完成它,所以它只能用 docker-compose up
来完成。
更新:我正在使用 Linux manjaro
我认为这里的问题是 docker-compose 可能 运行 多个容器.. 所以它通常不能附加到特定容器的标准输入。显然,在你只有一个容器的情况下,应该没有混淆,所以它 可以 这样做 - 但如果你稍后将另一个容器添加到 yml,这将改变行为,这将是当时令人困惑,本质上是一个错误。
所以 ..compose 不是这项工作的正确工具。
我有一个名为 dockersh
的小 bash 脚本,它可以很容易地放入任何 docker 图像的 shell 中:
#!/bin/sh
IMAGE=
shift
# sanitise the name a little
NAME=$(echo $IMAGE | tr '/:' '-')
# generate a random ID in case we have multiple running
ID=$(env LC_CTYPE=C tr -dc "a-z0-9" < /dev/urandom | head -c 10)
docker run --rm -ti \
--name $NAME-$ID \
-v $PWD:/mnt/$(basename $PWD) \
-v $HOME/.ssh:/root/.ssh \
$IMAGE \
"$@"
.ssh
挂载对于克隆 git 存储库等很有用。在 linux 上,您也可以通过将 $SSH_AUTH_SOCK
挂载到容器中来实现,但这并不在 mac 上工作(至少对我而言)。
对于上述情况,您可以 运行 为:
dockersh golang:1.11.1 bash
虽然您可能想让它对您自己来说不那么通用,并公开端口并挂载到 /go
等
在那个特定的用例中,解决方案应该如下所示。这样做的原因通常是 /bin/bash 与 -ti
一起使用以在容器内输入 shell。
通过对特定服务使用 运行 命令,可以使用 compose 完成同样的事情。请注意,我也公开了服务端口。
docker-compose run --service-ports server bash
https://docs.docker.com/compose/reference/run/
如果容器已经 运行ning 那么 exec
应该足够了。