【问题标题】:Create and build docker Dockerfile from a script从脚本创建和构建 docker Dockerfile
【发布时间】:2018-10-19 12:16:09
【问题描述】:

我在尝试创建一个脚本来创建和构建一个 docker 文件时遇到了一些困难,该文件获取当前用户的 uid 和 gid,并在容器内设置用户 vagrant 的 uid 和 gid 以匹配主机。

output = "FROM %s\nUSER root\nRUN usermod --uid %s vagrant && groupmod --gid %s vagrant && chown -R vagrant:vagrant /home/vagrant\nUSER vagrant" % (build_image, uid, gid)
f = open("Dockerfile", "w")
f.write(output)
f.close

# Build the image using the created Dockerfile
build_command = "docker build -t %s . --pull" % args.name
print("\nRunning: " + build_command)
subprocess.call(['bash', '-c', build_command])

docker build -t test-image . --pull 在命令行上工作,但在运行脚本时我得到:“来自守护进程的错误响应:Dockerfile (Dockerfile) 不能为空”

有人知道为什么会发生这种情况吗?

【问题讨论】:

  • 顺便说一句,将字符串传递给['bash', '-c', cmd] 只是重新实现cmd, shell=True 的一种迂回方式。你想避免两者;直接传递['docker', 'build', '-t', args.name, '.', '--pull']
  • 与脚本相比,您是否在命令行上的不同工作目录中?
  • @tripleee 谢谢,很高兴知道,我会改的
  • @Bernhard 不,它都在同一个目录中
  • 文件是否已创建,是否包含您所期望的内容?

标签: python linux docker


【解决方案1】:

你实际上并没有打电话给f.close;该行的结果是未调用的关闭函数本身。通常,在 Python 中处理文件的更好方法是使用上下文管理器“with”语法:

with open("Dockerfile", "w") as f:
  f.write(output)

然后该文件将为您关闭。

(实际写入有点昂贵,因此 Python 与大多数其他语言一样,实际上会将要写入的内容保存在内存缓冲区中,直到文件关闭、显式刷新或超过一定数量的内容写,这就是为什么不实际调用f.close() 会导致问题。)

【讨论】:

  • 虽然我同意上下文管理器在这里更好:在显示的代码中有一个f.close?应该是f.close()
  • 谢谢你这解决了问题,我还是python的新手,谢谢你的清晰解释。
  • 是的,需要写成f.close()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多