One idea I came up with but which isn't very satisfying is to have two image textures and automatically use them alternating. Also keeping track of which is the newer one to finally display it on the screen.
This is actually the way it's commonly done, and the technique even has a name: "ping-ponging".
There's some discussion on the technique here (look for the section headed "ping-pong texturing").
As for the "why", if you think about it, it makes sense. Many post-processing effects don't actually have a direct one-to-one mapping between source and destination texels (or "fragments" if you prefer; I'll just continue to use "texels" here as it may be clearer to aid understanding). Common examples would be blur and distortion effects, where the source texel position may not be same as the destination position. What this could mean is that your input could have been a texel that was previously already processed, and so is not valid.
This is leaving aside any hardware considerations, but it is worth noting that hardware can make certain assumptions ahead of time if it is guaranteed that you're not going to read from and write to the same image, and that those assumptions can lead to better performance.
If you're running an effect where you know that you're always going to have this one-to-one mapping (e.g. maybe simulating a gamma curve using FBOs) then you've got image load/store in OpenGL and that provides an option that would meet this requirement, although I'd encourage you to do a comparative benchmark before committing, as it may be the case that you'll still get better performance from doing it the traditional way.