如何设置docker-compose / bin / bash入口点?

时间:2018-10-04 13:47:03

标签: docker docker-compose docker-engine

我只想使用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

docker-compose.yml and console

阅读我当然也尝试替代的上述文章

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

什么也没有发生。没有错误并退出,也没有“完成”消息。

Try with substitued tty and stdin

使用sh而不是bash进行尝试时,它会显示command: '-it的内容:

server_1  | /bin/sh: 0: Illegal option -t

替换bash时也像粘贴bash一样卡住。

请注意,我只需使用以下命令即可构建和运行不带命令和入口点的服务器:

docker-compose up
docker-compose run --service-ports server

我的问题仍然是如何使用docker-compose和一个入口点来做到这一点,因此只能使用docker-compose up来完成。

更新:我正在使用Linux manjaro

2 个答案:

答案 0 :(得分:2)

我认为这里的问题是docker-compose可能会运行多个容器..因此,它通常不能附加到特定容器的stdin。显然,在您只有一个容器的情况下,应该没有混淆,因此它可以-但这会改变行为,如果您以后在yml中添加了另一个容器,这将造成混乱,并且从本质上讲就是一个错误。

所以.. compose并不是这项工作的正确工具。

我有一个名为dockersh的bash脚本,它可以很容易地放入任何docker映像的shell中:

#!/bin/sh

IMAGE=$1
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 repos等很有用。在linux上,您也可以通过将$SSH_AUTH_SOCK挂载到容器中来进行此操作,但这在mac上不起作用(至少对我而言) )。

对于上述情况,您可以运行为:

dockersh golang:1.11.1 bash

尽管您可能希望自己降低通用性,并公开端口并装入/go等。

答案 1 :(得分:0)

在该特定用例中,解决方案应如下所示。这样做的原因通常是 /bin/bash 与 -ti 一起使用以进入容器内的 shell。

同样的事情可以通过对特定服务使用 run 命令来完成。请注意,我也公开了服务端口。

docker-compose run --service-ports server bash

https://docs.docker.com/compose/reference/run/

如果容器已经在运行,那么 exec 应该就足够了。