У меня возникают трудности с созданием скрипта, который создает и создает файл докеров, который получает текущие пользователи 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) не может быть пустым"
У кого-нибудь есть идеи, почему это может произойти?
Вы на самом деле не вызываете f.close
; результатом этой линии является сама невостребованная близкая функция. Лучшим подходом к обработке файлов в Python в целом является использование диспетчера контекста с синтаксисом:
with open("Dockerfile", "w") as f:
f.write(output)
и тогда файл будет закрыт для вас.
(Фактические записи несколько дороги, и поэтому Python, как и большинство других языков, фактически будет хранить контент в буфере в памяти до тех пор, пока файл не будет закрыт, явно не очищен или не будет написано больше определенного количества контента, что почему не на самом деле вызов f.close()
вызывает проблему.)
f.close
? Должно ли это быть f.close()
?
['bash', '-c', cmd]
является просто окольным способом переопределенияcmd, shell=True
. Вы хотите избежать обоих; передать напрямую['docker', 'build', '-t', args.name, '.', '--pull']
.