【问题标题】:Save current directory between docker exec commands在 docker exec 命令之间保存当前目录
【发布时间】: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


【解决方案1】:

我认为你应该使用这种格式:

dingrui@gdcni:~/onie$ docker exec -w /root example sh -c 'mkdir -p example; touch example/file; cd example; ls'
file

或将这些命令写入脚本,然后将其挂载到容器并在容器中运行:

dingrui@gdcni:~/onie$ docker run -itd -w /root -v $(pwd):/app --name example busybox /app/test.sh
12f7f2b55182bd18c45ce31e03390544adaedc1a2dd923d3bc4293b214301650
dingrui@gdcni:~/onie$ docker logs example 
file

【讨论】:

  • 连接所有命令可能更容易,并将它们作为环境变量传递给容器,然后运行类似docker exec <ID> 'sh -c eval "${SCRIPT}"'
猜你喜欢
  • 1970-01-01
  • 2020-03-18
  • 2014-04-16
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2011-03-07
相关资源
最近更新 更多