Создать и собрать Docker Dockerfile из скрипта

1

У меня возникают трудности с созданием скрипта, который создает и создает файл докеров, который получает текущие пользователи 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 docker build -t test-image. --pull работает в командной строке, но при запуске скрипта я получаю: "Ошибка ответа от демона: Dockerfile (Dockerfile) не может быть пустым"

У кого-нибудь есть идеи, почему это может произойти?

  • 2
    Кроме того, передача строки в ['bash', '-c', cmd] является просто окольным способом переопределения cmd, shell=True . Вы хотите избежать обоих; передать напрямую ['docker', 'build', '-t', args.name, '.', '--pull'] .
  • 0
    Возможно, вы находитесь в другом рабочем каталоге в командной строке по сравнению со сценарием?
Показать ещё 4 комментария
Теги:
docker

1 ответ

3
Лучший ответ

Вы на самом деле не вызываете f.close; результатом этой линии является сама невостребованная близкая функция. Лучшим подходом к обработке файлов в Python в целом является использование диспетчера контекста с синтаксисом:

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

и тогда файл будет закрыт для вас.

(Фактические записи несколько дороги, и поэтому Python, как и большинство других языков, фактически будет хранить контент в буфере в памяти до тех пор, пока файл не будет закрыт, явно не очищен или не будет написано больше определенного количества контента, что почему не на самом деле вызов f.close() вызывает проблему.)

  • 0
    в то время как я согласен, что менеджер контекста здесь лучше: в показанном коде есть f.close ? Должно ли это быть f.close() ?
  • 0
    Спасибо, это решило проблемы, я все еще новичок в Python, спасибо за четкое объяснение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню