首页 文章

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

提问于
浏览
1

我想使用docker-compose.yml以commad / 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一样卡住 .

请注意,我可以使用以下命令在没有命令和入口点的情况下构建和运行服务器:

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

我的问题仍然是如何使用docker-compose和一个入口点来完成它所以它只能用 docker-compose up 来完成 .

更新:我正在使用Linux manjaro

1 回答

  • 1

    我认为这里的问题是docker-compose可能会运行多个容器..所以它通常不能附加到特定容器的stdin . 显然,在你的情况下,只有一个容器,应该没有混乱,所以它可以做到 - 但如果你以后添加另一个容器到yml,这将改变行为,这将是混乱,并在那一点上基本上是一个错误 .

    所以..撰写不是这项工作的正确工具 .

    我有一个名为 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 mount对于克隆git repos等很有用 . 在linux上,你也可以通过将 $SSH_AUTH_SOCK 挂载到容器中来做到这一点,但这在mac上不起作用(至少对我来说) .

    对于上面的情况,您可以运行:

    dockersh golang:1.11.1 bash
    

    虽然您可能希望使自己的通用性稍差,并将端口和mount挂载到 /go 等 .

相关问题