【问题标题】:Exec /bin/bash in Docker Compose在 Docker Compose 中执行 /bin/bash
【发布时间】:2020-07-27 03:57:39
【问题描述】:

我正在尝试自动化 docker-compose 文件。我想做一些初步的任务,比如更新源代码、构建库,并通过调用docker-compose up 在容器上自动运行bash 终端。有没有办法做到这一点?
我尝试执行以下操作:

version: '3.3'
services:
  service1:
    ...
  service2:
    build:
      dockerfile: Dockerfile.hardware
      context: .
    container_name: container2
    network_mode: "host"
    privileged: true
    environment:
      - DISPLAY=unix$DISPLAY
      - MACHINE=${MACHINE}
    shm_size: 256M
    volumes:
      ...
    stop_signal: SIGINT
    working_dir: /home/user
    command: bash -c "./Arduino/libraries/build_arduino_lib.sh && exec /bin/bash"

但是进程没有执行 /bin/bash 就终止了。

【问题讨论】:

  • 你确定吗? f/e,你确定它不执行 bash,然后因为没有可用的标准输入而立即退出?
  • (如果您提供的代码是minimal reproducible example,我们会更容易测试,这是可以在不更改的情况下运行的最短的代码;...s -- 就像对问题中未包含的其他内容的引用一样 -- 并非如此)。
  • 有没有办法检查它是否立即退出?我不太确定自己,因为我对此不是很熟悉。抱歉,由于多种原因,我无法分享完整的代码。
  • 因此,一种简单的方法是将您的最后一个bash -c 更改为bash -xc;这将使 bash 日志命令运行到 stderr,因此如果它运行,您可以看到它需要执行的两个步骤(第一个是运行 build_arduino_lib.sh,第二个是 exec 运行另一个 bash 副本)。而且我们不想要完整的代码; minimal reproducible example 的“最小”部分是我们认真对待的。相反,我们需要尽可能短的代码实际重现问题。请参阅sscce.org 的“修剪技巧”部分,了解有关如何到达那里的一些指示。
  • “更新源代码和构建库之类的任务”通常应该在 Dockerfile 中完成;容器的主进程(Dockerfile 中的 CMD)实际上应该运行作业,而不是交互式 shell。您也不能真正从docker-compose.yml 文件启动交互式shell。我建议重新审视这种整体方法。

标签: bash docker docker-compose


【解决方案1】:

要获得交互式 bash,您需要使用 run 并指定服务:

docker-compose run service2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2020-03-03
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多