Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix media uploads for Docker in rootless mode #50608

Closed
wants to merge 6 commits into from

Conversation

ajlende
Copy link
Contributor

@ajlende ajlende commented May 13, 2023

What?

Fixes media uploads for Docker running in rootless mode.

$ npx playwright test --config test/e2e/playwright.config.ts -g inserted Image      

Running 1 test using 1 worker

  ✘  1 [chromium] › editor/blocks/image.spec.js:35:2 › Image › can be inserted (7.3s)
Failed to load resource: the server responded with a status of 500 (Internal Server Error)


  1) [chromium] › editor/blocks/image.spec.js:35:2 › Image › can be inserted ───────────────────────

    Error: Timed out 5000ms waiting for expect(received).toHaveAttribute(expected)

    Expected pattern: /acb14c9d-3b63-4942-be10-4da20cf1a647/
    Received string:  ""
    Call log:
      - expect.toHaveAttribute with timeout 5000ms
      - waiting for locator('role=document[name="Block: Image"i]').locator('role=img')
      - waiting for locator('role=document[name="Block: Image"i]').locator('role=img')


      47 |              const image = imageBlock.locator( 'role=img' );
      48 |              await expect( image ).toBeVisible();
    > 49 |              await expect( image ).toHaveAttribute( 'src', new RegExp( filename ) );
         |                                    ^
      50 |
      51 |              const regex = new RegExp(
      52 |                      `<!-- wp:image {"id":(\\d+),"sizeSlug":"full","linkDestination":"none"} -->

        at /home/ajlende/Documents/gutenberg/test/e2e/specs/editor/blocks/image.spec.js:49:25

    attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
    artifacts/test-results/editor-blocks-image-Image-can-be-inserted-chromium/trace.zip
    Usage:

        npx playwright show-trace artifacts/test-results/editor-blocks-image-Image-can-be-inserted-chromium/trace.zip

    ────────────────────────────────────────────────────────────────────────────────────────────────

    attachment #2: screenshot (image/png) ──────────────────────────────────────────────────────────
    artifacts/test-results/editor-blocks-image-Image-can-be-inserted-chromium/test-failed-1.png
    ────────────────────────────────────────────────────────────────────────────────────────────────

  1 failed
    [chromium] › editor/blocks/image.spec.js:35:2 › Image › can be inserted ────────────────────────
$ npx playwright show-trace artifacts/test-results/editor-blocks-image-Image-can-be-inserted-chromium/trace.zip

image upload error screenshot

Unable to create directory wp-content/uploads/2023/05. Is its parent directory writable by the server?

Why?

Running Docker in rootless mode provides an extra layer of security by not running the daemon with the root user.

May also solve #32519 because it's using a volume for the uploads now.

How?

  • Creates a volume for the uploads directory.
  • Changes uploads directory to be owned by the host user.

Testing Instructions

  1. Install Docker in rootless mode
  2. Run wp-env start
  3. Upload image

Testing Instructions for Keyboard

Screenshots or screencast

@ajlende ajlende added the [Package] Env /packages/env label May 13, 2023
@ajlende ajlende self-assigned this May 13, 2023
@github-actions
Copy link

github-actions bot commented May 13, 2023

Size Change: 0 B

Total Size: 1.4 MB

ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.33 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 472 B
build/block-directory/index.min.js 7.18 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.12 kB
build/block-editor/content.css 4.12 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/index.min.js 198 kB
build/block-editor/style-rtl.css 15.2 kB
build/block-editor/style.css 15.1 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 159 B
build/block-library/blocks/details/style.css 159 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/interactivity.min.js 395 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.33 kB
build/block-library/blocks/navigation/editor.css 2.33 kB
build/block-library/blocks/navigation/interactivity.min.js 865 B
build/block-library/blocks/navigation/style-rtl.css 2.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 443 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 281 B
build/block-library/blocks/post-template/style.css 281 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12 kB
build/block-library/editor.css 12 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 204 kB
build/block-library/interactivity/runtime.min.js 2.23 kB
build/block-library/interactivity/vendors.min.js 8.15 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.8 kB
build/block-library/style.css 12.8 kB
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 50.9 kB
build/commands/index.min.js 15 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/components/index.min.js 232 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/core-commands/index.min.js 1.8 kB
build/core-data/index.min.js 16.5 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 708 B
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.5 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.2 kB
build/edit-post/style-rtl.css 7.76 kB
build/edit-post/style.css 7.75 kB
build/edit-site/index.min.js 63.9 kB
build/edit-site/style-rtl.css 10.5 kB
build/edit-site/style.css 10.5 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/index.min.js 45.8 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.89 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.77 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.73 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.91 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.97 kB
build/notices/index.min.js 963 B
build/plugins/index.min.js 1.85 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.33 kB
build/primitives/index.min.js 944 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 939 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.74 kB
build/reusable-blocks/index.min.js 2.25 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 2.08 kB
build/shortcode/index.min.js 1.42 kB
build/style-engine/index.min.js 1.52 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.65 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.28 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@ajlende
Copy link
Contributor Author

ajlende commented May 19, 2023

I managed to get e2e tests working in rootless docker with this change on my machine, but I'm getting this error on GitHub doing the same thing.

 Step 10/25 : RUN mkdir -p /var/www/html/wp-content/uploads/
 ---> Running in b8ef0832edac
Removing intermediate container b8ef0832edac
 ---> 2c04e9c8799a
Step 11/25 : RUN chown -R $HOST_UID:$HOST_GID /var/www/html/wp-content/uploads/
 ---> Running in 30b7b5997c44
chown: cannot access '/var/www/html/wp-content/uploads/': No such file or directory

@noahtallen I'm no Docker expert, is there any reason this would be failing here? Or is there a better way to change permissions in Docker?

@noahtallen
Copy link
Member

Hm, I'm no expert either, but throwing out some ideas:

  • Is chown actually required after running mkdir? (Wouldn't the user be the same?)
  • Why would we need to create the directory if it included in the docker-compose mount? (see the home mount for an example?)

I'm also curious, what errors do you see in rootless mode?

I also don't have a good way to test rootless mode unfortunately. thanks for opening a PR!

@ajlende ajlende force-pushed the fix/wp-env-rootless-docker branch from 3886006 to 71d97f6 Compare May 22, 2023 03:28
@ajlende
Copy link
Contributor Author

ajlende commented May 22, 2023

Is chown actually required after running mkdir? (Wouldn't the user be the same?)

The DOCKERFILE is running the commands as root, so chown is necessary to move ownership to the host user.

Why would we need to create the directory if it included in the docker-compose mount?

That's what I started with, but I kept getting the same error until I created the dir and chowned it.

See the home mount for an example?

The -m flag on useradd creates the user's home directory with the right permissions.

I'm also curious, what errors do you see in rootless mode?

Updated the description. I should have had that added before :)

@ajlende ajlende marked this pull request as ready for review May 22, 2023 17:15
@github-actions
Copy link

github-actions bot commented May 22, 2023

Flaky tests detected in c44b630.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/5049246189
📝 Reported issues:

@ajlende
Copy link
Contributor Author

ajlende commented May 22, 2023

I made it past wp-env start by using install rather than mkdir and chown. TIL you can create directories with the -d flag of install, and for some reason that works better here. 🤷

@ajlende ajlende force-pushed the fix/wp-env-rootless-docker branch from 8d9cf28 to fe62240 Compare May 22, 2023 18:07
Copy link
Contributor

@ObliviousHarmony ObliviousHarmony left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is interesting @ajlende. Given the existence of this particular problem, however, I think there will be other permission problems when running Docker in rootless mode to consider. All of the issues fixed by #49962 would be experienced in rootless mode.

The problem is that the uid and gid in rootless mode are in the host user's namespace rather than being mapped in the same way. This means that root in the container is actually the user's uid and your host user's uid in the container is an offset from the host user's uid. The end result is that the "user" in the container doesn't have write access to any of the files.

This PR works because you're forcing ownership of /var/www/html/wp-content/uploads to the user namespace uid, but, I wonder if there's another approach where we can preserve the fixes provided by the original PR? What if we set the userns_mode to host in the docker-compose.yml file? The Docker daemon would still not be running as root, but, the uid mapping should work again, right? This would also only apply to the wp-env containers.

packages/env/lib/build-docker-compose-config.js Outdated Show resolved Hide resolved
@@ -54,6 +54,11 @@ function getMounts(
? `user-home:/home/${ hostUsername }`
: `tests-user-home:/home/${ hostUsername }`;

const userUploadsMount =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if there is a mappings entry for /var/www/html/wp-content/uploads already?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sorry, I don't really know that much about docker so I may be misunderstanding. This function creates a new Set() which, by definition, doesn't contain duplicates, so I don't think there could already be an entry for it?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's take, for example, a wp-env.json file containing this:

{
  "mappings": {
    "/var/www/html/wp-content/uploads": "./env/uploads"
  }
}

This would translate to a unique entry in the Set, but, be a duplicate mapping for /var/www/html/wp-content/upload.

@ajlende
Copy link
Contributor Author

ajlende commented May 22, 2023

The tests are all consistently passing locally, but consistently failing on GitHub. I'm not really sure how to debug this.

@ObliviousHarmony
Copy link
Contributor

Also, #32519 should actually already be fixed. The uploads are now coming from the locally mapped WordPress installation, so, they persist unless you explicitly run wp-env destroy.

@ajlende
Copy link
Contributor Author

ajlende commented May 22, 2023

Thanks for the quick review @ObliviousHarmony!

What if we set the userns_mode to host in the docker-compose.yml file?

I just tried that on a fresh branch off of trunk, and I still end up with the original error where uploads aren't allowed.

Given the existence of this particular problem, however, I think there will be other permission problems when running Docker in rootless mode to consider.

I was wondering if we should set up permissions as described in the Hardening WordPress docs, but I had something working locally with just the uploads change and figured it would be better to start small and fix my one issue first.

@ObliviousHarmony
Copy link
Contributor

I just tried that on a fresh branch off of trunk, and I still end up with the original error where uploads aren't allowed.

We did some further debugging together and weren't able to find a way to make this work. I did some further research and it looks like this is unfortunately unavoidable. If you're running in rootless then using your host uid and gid will give permission errors.

I was wondering if we should set up permissions as described in the Hardening WordPress docs, but I had something working locally with just the uploads change and figured it would be better to start small and fix my one issue first.

Honestly, I would prefer if we avoided added any permission hacks specific for Rootless Docker. There's a problem here in how permissions work between these two deployments, but, I've got an idea!

In #50814 (comment) it was highlighted that there's a problem with Windows caused by the usage of root's UID. In fixing this we can support running Docker internally as uid 0, so, what if we did that here? Since we have getHostUser(), what if we used something like docker context inspect to detect headless mode and then used a uid and gid of 0 in that case? It would map to the host user in the same way and so there would be no permission issues.

@ObliviousHarmony
Copy link
Contributor

Let me take a pass at solving both of these problems in one go. Could you share the output of docker context inspect @ajlende so I can take a look at that?

@ajlende
Copy link
Contributor Author

ajlende commented May 22, 2023

Could you share the output of docker context inspect @ajlende so I can take a look at that?

[
    {
        "Name": "default",
        "Metadata": {},
        "Endpoints": {
            "docker": {
                "Host": "unix:///run/user/1000/docker.sock",
                "SkipTLSVerify": false
            }
        },
        "TLSMaterial": {},
        "Storage": {
            "MetadataPath": "\u003cIN MEMORY\u003e",
            "TLSPath": "\u003cIN MEMORY\u003e"
        }
    }
]

@ObliviousHarmony
Copy link
Contributor

What about docker info @ajlende?

@noahtallen
Copy link
Member

In #50814 (comment) it was highlighted that there's a problem with Windows caused by the usage of root's UID. In fixing this we can support running Docker internally as uid 0, so, what if we did that here? Since we have getHostUser(), what if we used something like docker context inspect to detect headless mode and then used a uid and gid of 0 in that case? It would map to the host user in the same way and so there would be no permission issues.

Nice, I love the idea of solving both problems at once!

@ajlende
Copy link
Contributor Author

ajlende commented May 23, 2023

What about docker info @ajlende?

$ docker info

Client:
 Version:    24.0.0
 Context:    default
 Debug Mode: false
 Plugins:
  compose: Docker Compose (Docker Inc.)
    Version:  2.18.1
    Path:     /usr/lib/docker/cli-plugins/docker-compose

Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 1
 Server Version: 24.0.0
 Storage Driver: fuse-overlayfs
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 1677a17964311325ed1c31e2c0a3589ce6d5c30d.m
 runc version: 
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  rootless
  cgroupns
 Kernel Version: 6.3.2-arch1-1
 Operating System: Arch Linux
 OSType: linux
 Architecture: x86_64
 CPUs: 16
 Total Memory: 31.27GiB
 Name: astrid
 ID: LQHD:OW2Z:L4TD:EDN4:KR6N:7VTY:45MA:GI2Z:ICE5:VHT3:HWJJ:PNYJ
 Docker Root Dir: /home/ajlende/.local/share/docker
 Debug Mode: true
  File Descriptors: 24
  Goroutines: 39
  System Time: 2023-05-23T12:42:59.600690909-05:00
  EventsListeners: 0
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false


It does seem to list rootless under Security Options.

@ObliviousHarmony
Copy link
Contributor

I ran into what should have been a pretty obvious problem with running everything as root 😅 Everything gets really mad and the lengths we have to go to in order to make that work are pretty extreme.

I'll let @noahtallen weigh in, but, I don't think rootless Docker is something we should try and go to extreme lengths to support. Ultimately it boils down to everything being owned by root again and the various problems that can cause. Although we can fix the particular issue with uploads, we're still going to see problems elsewhere in cases where the filesystem gets manipulated in any way. A lot of folks I know who used Linux previously avoided wp-env like the plague because of compatibility problems and I think the same problems exist here when using rootless Docker.

Ideally userns_mode would have let us disable user mapping, but, that doesn't seem to be the case. These kinds of problems seem relatively common with using rootless Docker and mapped directories unfortunately. I think the best course of action here would be to use wp-env run with sudo commands to make any permission-related changes you need to get things working for you locally.

@noahtallen
Copy link
Member

I mostly agree with @ObliviousHarmony. I don't think wp-env should try super hard to support this case, but at the same time, if there is a simple fix to certain issues, I think we should include it. But if rootless mode is generally incompatible with the way wp-env & docker compose work with mounts and WordPress, it sounds like it'd be difficult for us to support properly.

@ajlende
Copy link
Contributor Author

ajlende commented May 23, 2023

Thanks for the help and teaching me some things about wp-env. Since this isn't as simple as I first thought, we'll close this PR, and I'll take @ObliviousHarmony's suggestion to just modify my containers manually for now.

@ajlende ajlende closed this May 23, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Env /packages/env
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants