First-half goals from Jerome Boateng and Thomas Muller were enough to keep Bayern’s treble dreams alive and avenge a semi-final defeat at the hands of Dortmund last season, despite Andriy Yarmolenko’s lifeline.
The result is Peter Stoger’s first defeat since taking charge of BVB this month, with his side having won back-to-back Bundesliga matches since he was appointed as successor to Peter Bosz.
Dortmund stunned Bayern in the last four in 2016-17 as they came from two goals down to win 3-2, but their chances of another upset were dealt a blow before kick-off as the injured Pierre-Emerick Aubameyang failed to make the squad.
Boateng nodded the home side ahead in the 12th minute after a spell of early dominance and Muller doubled the lead before the break at the end of a fine passing move, shortly after Yarmolenko had seen an effort cleared off the line.
Dortmund improved in the second half but they had Roman Burki to thank for keeping his side just about in the contest, the goalkeeper making excellent saves to deny James Rodriguez and Muller in particular.
Yarmolenko gave BVB some hope but Bayern held out for their sixth win in a row in all competitions, and they can now prepare for a quarter-final tie beginning in January, with duties for 2017 completed.
Bayern’s bright start almost yielded a goal in the third minute, with Arturo Vidal smacking the crossbar with a diving header following Joshua Kimmich’s pinpoint cross.
Burki could only watch the ball bounce clear but the goalkeeper was in the thick of the action five minutes later, standing tall to block Robert Lewandowski’s chip after the striker sprung Dortmund’s offside trap.
Shortly after, Burki blocked a rasping drive from Franck Ribery before Lewandowski hooked the rebound wide, as Bayern continued to threaten in the opening exchanges.
The breakthrough duly arrived with 12 minutes gone, as Boateng steered the rebound into the right-hand corner of the net after Niklas Sule crashed a header off the bar.
Dortmund had offered little support to Yarmolenko and Christian Pulisic in attack but they almost snatched an equaliser 10 minutes before the break, with Yarmolenko placing a shot past Sven Ulreich only for David Alaba to clear brilliantly off the line.
Pulisic late show extends Stoger’s perfect start with Dortmund
Christian Pulisic’s superb late goal maintained Peter Stoger’s fine start at Borussia Dortmund as they climbed to third in the Bundesliga with a 2-1 victory against Hoffenheim.
It proved to be a costly miss as, five minutes later, Bayern doubled their lead. Lewandowski’s clever pass sent Muller free into the penalty area, where he chipped a clever finish past Burki from six yards out.
The home side nearly had a third in the first minute of the second half, with Burki getting down swiftly to claw away James’ effort, before Sule headed the resulting corner over the bar.
Muller thought he had scored a second when he met Alaba’s cross at the right-hand post, only for Burki to produce the save of the match, the Switzerland goalkeeper lifting a foot to keep out the header.
Shinji Kagawa shot wide from a tight angle as Dortmund pushed forward looking for a lifeline, but Muller nearly squeezed in his side’s third on the counter-attack, with James just unable to connect with the loose ball.
Bayern were punished for dropping deeper and deeper with 13 minutes left, as Yarmolenko headed past Ulreich after being picked out brilliantly by Kagawa, but Dortmund could not manage another famous comeback as they ended 2017 in disappointing fashion.