当 运行 一个 Docker 容器时避免重复参数

Avoiding duplicated arguments when running a Docker container

我有一个 tensorflow 训练脚本,我想 运行 使用 Docker 容器(基于官方 TF GPU 图像)。尽管一切正常,运行将容器与脚本结合起来非常冗长和丑陋。主要问题是我的训练脚本允许用户指定训练期间使用的各种目录,用于输入数据、日志记录、生成输出等。我不想改变我的用户习惯,所以容器需要被告知这些用户定义目录的位置,因此它可以挂载它们。所以我最终得到这样的结果:

docker run \
  -it --rm --gpus all -d \
  --mount type=bind,source=/home/guest/datasets/my-dataset,target=/datasets/my-dataset \
  --mount type=bind,source=/home/guest/my-scripts/config.json,target=/config.json \
  -v /home/guest/my-scripts/logdir:/logdir \
  -v /home/guest/my-scripts/generated:/generated \
  train-image \
  python train.py \
  --data_dir /datasets/my-dataset \
  --gpu 0 \
  --logdir ./logdir \
  --output ./generated \
  --config_file ./config.json \
  --num_epochs 250 \
  --batch_size 128 \
  --checkpoint_every 5 \
  --generate True \
  --resume False

在上面我将一个数据集从主机挂载到容器中,并且还挂载了一个配置文件config.json(它配置了 TF 模型)。我将日志目录 logdir 和输出目录 generated 指定为卷。这些资源中的每一个也作为参数传递给 train.py 脚本。

这一切都非常丑陋,但我看不到另一种方法。当然,我可以将所有这些放在 shell 脚本中,并提供从外部设置这些重复值的命令行参数。但这似乎不是一个好的解决方案,因为如果我想对容器进行任何其他操作,例如检查日志,我会使用原始 docker 命令。

我怀疑这个问题可能会被标记为基于意见,但我还没有找到可以推荐给我的用户的好解决方案。

正如用户 Ron van der Heijden 指出的那样,一种解决方案是将 docker-compose.env 文件中定义的环境变量结合使用。不错的回答。