@@ -1215,5 +1215,141 @@ extension TestCLIBuildBase {
12151215 )
12161216 #expect( try self . inspectImage ( imageName) == imageName, " expected to have successfully built \( imageName) " )
12171217 }
1218+
1219+ @Test func testBuildQuotedImageDockerfileArg( ) throws {
1220+ let tempDir : URL = try createTempDir ( )
1221+ defer {
1222+ try ! FileManager . default. removeItem ( at: tempDir)
1223+ }
1224+
1225+ let dockerfile : String =
1226+ """
1227+ ARG IMAGE= " ghcr.io/linuxcontainers/alpine:3.20 "
1228+ FROM $IMAGE
1229+ RUN test -f /etc/alpine-release
1230+ """
1231+ try createContext ( tempDir: tempDir, dockerfile: dockerfile)
1232+
1233+ let imageName = " registry.local/quoted-image-dockerfile-arg: \( UUID ( ) . uuidString) "
1234+ try self . build ( tag: imageName, tempDir: tempDir)
1235+ #expect( try self . inspectImage ( imageName) == imageName, " expected to have successfully built \( imageName) " )
1236+ }
1237+
1238+ @Test func testBuildQuotedStringDockerfileArg( ) throws {
1239+ let tempDir : URL = try createTempDir ( )
1240+ defer {
1241+ try ! FileManager . default. removeItem ( at: tempDir)
1242+ }
1243+
1244+ let dockerfile : String =
1245+ """
1246+ FROM ghcr.io/linuxcontainers/alpine:3.20
1247+ ARG MYSTRING=' " Hello, world! " '
1248+ RUN test " $MYSTRING " = ' " Hello, world! " '
1249+ """
1250+ try createContext ( tempDir: tempDir, dockerfile: dockerfile)
1251+
1252+ let imageName = " registry.local/quoted-string-dockerfile-arg: \( UUID ( ) . uuidString) "
1253+ try self . build ( tag: imageName, tempDir: tempDir)
1254+ #expect( try self . inspectImage ( imageName) == imageName, " expected to have successfully built \( imageName) " )
1255+ }
1256+
1257+ @Test func testBuildForwardReferencedDockerfileArg( ) throws {
1258+ let tempDir : URL = try createTempDir ( )
1259+ defer {
1260+ try ! FileManager . default. removeItem ( at: tempDir)
1261+ }
1262+
1263+ let dockerfile : String =
1264+ """
1265+ ARG ALPINE= " ghcr.io/linuxcontainers/alpine "
1266+ ARG IMAGE= " ${ALPINE}:3.20 "
1267+ FROM $IMAGE
1268+ RUN test -f /etc/alpine-release
1269+ """
1270+ try createContext ( tempDir: tempDir, dockerfile: dockerfile)
1271+
1272+ let imageName = " registry.local/forward-referenced-dockerfile-arg: \( UUID ( ) . uuidString) "
1273+ try self . build ( tag: imageName, tempDir: tempDir)
1274+ #expect(
1275+ try self . inspectImage ( imageName) == imageName, " expected to have successfully built \( imageName) "
1276+ )
1277+ }
1278+
1279+ @Test func testBuildQuotedImageBuildArg( ) throws {
1280+ let tempDir : URL = try createTempDir ( )
1281+ defer {
1282+ try ! FileManager . default. removeItem ( at: tempDir)
1283+ }
1284+
1285+ let dockerfile : String =
1286+ """
1287+ ARG IMAGE
1288+ FROM $IMAGE
1289+ RUN test -f /etc/alpine-release
1290+ """
1291+ try createContext ( tempDir: tempDir, dockerfile: dockerfile)
1292+
1293+ let imageName = " registry.local/quoted-image-build-arg: \( UUID ( ) . uuidString) "
1294+ try self . build (
1295+ tag: imageName,
1296+ tempDir: tempDir,
1297+ buildArgs: [
1298+ " IMAGE=ghcr.io/linuxcontainers/alpine:3.20 "
1299+ ]
1300+ )
1301+ #expect( try self . inspectImage ( imageName) == imageName, " expected to have successfully built \( imageName) " )
1302+ }
1303+
1304+ @Test func testBuildQuotedStringBuildArg( ) throws {
1305+ let tempDir : URL = try createTempDir ( )
1306+ defer {
1307+ try ! FileManager . default. removeItem ( at: tempDir)
1308+ }
1309+
1310+ let dockerfile : String =
1311+ """
1312+ FROM ghcr.io/linuxcontainers/alpine:3.20
1313+ ARG MYSTRING
1314+ RUN test " $MYSTRING " = ' " Hello, world! " '
1315+ """
1316+ try createContext ( tempDir: tempDir, dockerfile: dockerfile)
1317+
1318+ let imageName = " registry.local/quoted-string-build-arg: \( UUID ( ) . uuidString) "
1319+ try self . build (
1320+ tag: imageName,
1321+ tempDir: tempDir,
1322+ buildArgs: [
1323+ " MYSTRING= \" Hello, world! \" "
1324+ ]
1325+ )
1326+ #expect( try self . inspectImage ( imageName) == imageName, " expected to have successfully built \( imageName) " )
1327+ }
1328+
1329+ @Test func testBuildForwardReferencedBuildArg( ) throws {
1330+ let tempDir : URL = try createTempDir ( )
1331+ defer {
1332+ try ! FileManager . default. removeItem ( at: tempDir)
1333+ }
1334+
1335+ let dockerfile : String =
1336+ """
1337+ ARG ALPINE
1338+ ARG IMAGE= " $ALPINE:3.20 "
1339+ FROM $IMAGE
1340+ RUN test -f /etc/alpine-release
1341+ """
1342+ try createContext ( tempDir: tempDir, dockerfile: dockerfile)
1343+
1344+ let imageName = " registry.local/forward-referenced-build-arg: \( UUID ( ) . uuidString) "
1345+ try self . build (
1346+ tag: imageName,
1347+ tempDir: tempDir,
1348+ buildArgs: [
1349+ " ALPINE=ghcr.io/linuxcontainers/alpine "
1350+ ]
1351+ )
1352+ #expect( try self . inspectImage ( imageName) == imageName, " expected to have successfully built \( imageName) " )
1353+ }
12181354 }
12191355}
0 commit comments