【发布时间】:2020-03-08 03:43:23
【问题描述】:
我有一个命令列表,我需要一个一个地向正在运行的 docker 容器发出这些命令。但是,当我在容器中“cd”时,它没有按预期工作。例如:
docker run -di --name example alpine:latest
for CMD in 'mkdir -p example && touch example/file' 'cd example' 'ls'
do
docker exec -w='/root' example sh -c "$CMD"
done
将打印出example 而不是file。我应该如何正确执行一系列语句,但在它们执行之间保留工作目录?如果可以在不连接所有命令的情况下执行此操作?
【问题讨论】:
-
需要在for循环中运行这些命令吗?您可以简单地运行
docker run -di --name example alpine:latest && docker exec -w='/root' example sh -c "mkdir -p example; touch example/file; cd example ; ls",这将按照您的预期打印file。 -
@Adiii 我知道解决方法。虽然我想知道是否可以在状态之间导航。我实际上是从 yaml 文件中加载命令列表,并使用
docker exec执行它们。但是任何包含cd的命令系列都会失败。我想知道是否有办法做到这一点,无需解析每个命令,动态更改工作目录,或不连接命令。 -
可以给出
cd会失败的最小例子吗?dynamically changing the workdir是什么意思?当你通过 `-w='/root'` 时,它将运行这个'/root'目录 -
我的意思是解析cd命令,并在执行前将
-w设置为新的workdir。cd不会因为无法执行而失败,但是每个新的 docker exec 都会将 workdir 设置为默认值。我想知道是否有避免连接命令的方法,仅此而已。 -
你到底想做什么?您能否将这一系列命令打包到一个脚本中运行,或者更好的是,有一个可以触发此活动的网络可见端点?
docker exec是一个有用的调试工具,但它通常不是您与容器交互的主要方式。
标签: docker sh exec docker-exec