【发布时间】: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