@@ -186,7 +186,34 @@ extension Application {
186186 throw ValidationError ( " builder is not running " )
187187 }
188188
189- let dockerfile = try Data ( contentsOf: URL ( filePath: file) )
189+ let dockerfile : Data
190+ let tempFile = FileManager . default. temporaryDirectory. appendingPathComponent ( " TempDockerfile " )
191+ defer {
192+ try ? FileManager . default. removeItem ( at: tempFile)
193+ }
194+
195+ // Dockerfile should be read from stdin
196+ if file == " - " {
197+ guard FileManager . default. createFile ( atPath: tempFile. path ( ) , contents: nil ) else {
198+ throw ContainerizationError ( . internalError, message: " unable to create temporary file " )
199+ }
200+
201+ guard let outputHandle = try ? FileHandle ( forWritingTo: tempFile) else {
202+ throw ContainerizationError ( . internalError, message: " unable to open temporary file for writing " )
203+ }
204+
205+ let bufferSize = 4096
206+ while true {
207+ let chunk = FileHandle . standardInput. readData ( ofLength: bufferSize)
208+ if chunk. isEmpty { break }
209+ outputHandle. write ( chunk)
210+ }
211+ try outputHandle. close ( )
212+ dockerfile = try Data ( contentsOf: URL ( filePath: tempFile. path ( ) ) )
213+ } else {
214+ dockerfile = try Data ( contentsOf: URL ( filePath: file) )
215+ }
216+
190217 let systemHealth = try await ClientHealthCheck . ping ( timeout: . seconds( 10 ) )
191218 let exportPath = systemHealth. appRoot
192219 . appendingPathComponent ( Application . BuilderCommand. builderResourceDir)
@@ -351,7 +378,7 @@ extension Application {
351378 }
352379
353380 public func validate( ) throws {
354- guard FileManager . default. fileExists ( atPath: file) else {
381+ guard FileManager . default. fileExists ( atPath: file) || file == " - " else {
355382 throw ValidationError ( " Dockerfile does not exist at path: \( file) " )
356383 }
357384 guard FileManager . default. fileExists ( atPath: contextDir) else {
0 commit comments