the_content() behavior on attachment.php versus single.php

This is correct behavior, if your attachment doesn’t actually have anything in post_content field (which is quite common).

When post–centric templates run, prepend_attachment() is used as filter to “emulate” post content. This is not the case with template “intended” for attachments.

If you look at template-loader.php:

elseif ( is_attachment()     && $template = get_attachment_template()     ) :
    remove_filter('the_content', 'prepend_attachment');

the filter is explicitly removed.

So there is no “fake” content generated for you. You will have to decide and express in code what do you actually want shown for attachments, or simply add back the filter if that is what you want.