Antoine Griezmann was made to toil by a compact Denmark defence before he was replaced 20 minutes from time
Didier Deschamps’ side dominated possession but struggled to create any clear-cut chances against a determined Denmark, who will likely meet Croatia for a place in the quarter-finals.
France have scored just three times in three games in Russia, including a penalty and an own goal, and it was another disjointed display from one of the title favourites.
They will discover their opponents in the next round later on Tuesday, with Argentina needing to beat Nigeria in Saint Petersburg to stand a chance of qualifying.
Deschamps rested captain Hugo Lloris and Paul Pogba, with the Manchester United midfielder a booking away from suspension, while Kylian Mbappe was also left out among six changes.
Marseille goalkeeper Steve Mandanda, 33, made his first appearance at a major tournament, having been an unused substitute at the last three European Championships and the 2010 World Cup.
After much debate about the video assistant referee (VAR) following further controversy on Monday, it was inevitable any penalty area tussles would prompt strong appeals at the Luzhniki Stadium.
There have already been 20 penalties given at this World Cup, a tournament record before the group stage has even concluded.
Denmark’s Martin Braithwaite laid an early claim after going down under pressure from Presnel Kimpembe, although there appeared minimal contact at best.
France had a penalty shout of their own when Henrik Dalsgaard slid in on Lucas Hernandez, with Kasper Schmeichel tipping behind Olivier Giroud’s looping follow-up effort.
– Griezmann scythed down –
Committed play from Thomas Delaney saw him release Andreas Cornelius down the left flank but Christian Eriksen was unable to apply a finishing touch as Mandanda and Hernandez combined to clear.
Antoine Griezmann then shot tamely at Schmeichel from 20 yards, the Atletico Madrid forward’s biggest contribution coming just before the break when he sparked a threatening counter that drew a cynical foul from Mathias Jorgensen.
A bystander for long periods, Mandanda was nearly caught out by a speculative Eriksen free-kick as he spilled before pouncing on the rebound just ahead of Cornelius.
A miscued clearance from Djibril Sidibe soon presented Eriksen with another chance, the Tottenham star dragging wide of the target on this occasion.
Nabil Fekir was introduced for Griezmann for the final 20 minutes, and the Lyon forward looked lively right away as he hammered a shot just the wrong side of the post.
Mbappe was introduced late on for an ineffective Ousmane Dembele, but it was again Fekir who went closest to ending the impasse with a low, bouncing shot that forced Schmeichel into a sharp save.
Loud jeers from a sold-out crowd of 78,011 greeted the final whistle although it was a result that suited both sides as Denmark, now unbeaten in 18 matches, reached the latter stages of the World Cup for the first time since 2002.
Download our app and read this and other great stories on the move. Available for Android and iOS.