Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Converts Dockerfiles to be standalone - #22492

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts
Mar 27, 2022
Merged

Converts Dockerfiles to be standalone#22492
potiuk merged 1 commit into
apache:mainfrom
potiuk:inline-docker-scripts

Conversation

@potiuk

Copy link
Copy Markdown
Member

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:

  • heredocs
  • links for COPY commands

Both changes allows to solve multiple problems:

  • COPY for build scripts suffer from permission problems. Depending
    on umask setting of the host, the scripts could have different
    group permissions and invalidate docker cache. Inlining the
    scripts (automatically by pre-commit) gets rid of the problem
    completely

  • COPY --link allows to optimize and parallelize builds for
    Dockerfile.ci embedded source code. This should speed up
    not only building the images locally but also it will allow
    to use more efficiently cache for the CI builds (in case no
    source code change, the builds will use pre-cached layers from
    the cache more efficiently (and in parallel)

  • The PROD Dockerfile is now completely standalone. You do not
    need to have any folders or files to build Airlfow image. At
    the same time the versatility and support for multiple ways
    on how you can build the image (as described in
    https://airflow.apache.org/docs/docker-stack/build.html is
    maintained (this was a goal from the very beginning of the
    PROD Dockerfile but it was not easily achievable - heredocs
    allow to inline scripts that are used for the build and the
    pre-commits will make sure that there is one source of truth
    and nicely editable scripts for both PROD and CI Dockerfile.

The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.

Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.


^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Hello everyone. This is I think the last "serious" optimization of the way our Dockerfiles are constructed - enabled by "dockerfile:1.4" finally released few weeks ago. I was waiting for it to complete what I wanted to achieve from the very beginnig of my Dockerfiles journey, and I am happy we got there finally :) .

Wth this one a lot of problems we had with caching and speed of rebuildong the images on various machines will be gone and we will still continue having a very versatile and flexible Dockerfile - only that customizing the image will be now WAY easier, as it will only require downloading the single Dockerfile which is self-contained now and way faster to rebuild in many circumstances.

Looking forward to merging it soon - together with #22225 it shoudl vastly improve waiting time of Breeze users and speed up the CI image builds significantly.

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 8267747 to eed9972CompareMarch 23, 2022 17:55
@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @Bowrna - this one results in a few changes to the part you do on the prod image building #21956 . I've done some of them here, but some more changes are needed to bring the changes also to the python PROD Build too:

  • I removed "fix_group_permissions" part - from both the old Breeze and the new one (so you do not need to do anything for that one). This is a good example of "code is not an asset but liability" - by inlining the scripts I could finally get rid of all the permission problems that various host configuration could cause and rebuilding the image with cache will be much more predictable, but also we could get rid of the "not-very-reliable" code that I added to workaround that problem before (not very succesfully often) :). - inlining the scripts to the image solves it completely

  • There is a need to add few changes (you will see it there)
    --build-arg DOCKERF_CONTEXT_FILES="docker-context-files" needs to be added in "prod build" command
    --cache:max should be added also in the CI image (because it is multi-segment image now)

@potiuk

Copy link
Copy Markdown
MemberAuthor

cc: @dstandish@kaxil@jedcunningham@mik-laj - this one also contains something that I promised some time ago - detailed changelog for all 2.* Dockerfiles. I tried to describe in detail what was changed in which version but it might need some clarifications as I have too many assumptions on my Head. Any comments are appreciated.

@potiuk

Copy link
Copy Markdown
MemberAuthor

(and I could split some of those changes but not many BTW). They are all very tightly connected I am afraid.

Comment threadDockerfile Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/add-build-essential-custom.sh Outdated
Comment threaddocs/docker-stack/docker-examples/customizing/own-requirements.sh Outdated
Comment threadscripts/ci/libraries/_permissions.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
Comment threadscripts/ci/libraries/_build_images.sh Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from 478c7d7 to 6821bf2CompareMarch 23, 2022 18:51
@potiuk
potiukforce-pushed the inline-docker-scripts branch 3 times, most recently from fe0ae0c to c13301cCompareMarch 23, 2022 21:59
potiuk added a commit to potiuk/airflow that referenced this pull request Mar 23, 2022
In order to build PROD image with inlined scripts, we need to merge
a change to `main` to pass DOCKER_CONTEXT_FILES arg as parameter.
Related to apache#22492
@potiuk

Copy link
Copy Markdown
MemberAuthor

We need to merge #22492 in order to get this PR green. I've added a better error messaging for that case (the build shoudl fail now with a better error message).

@jedcunninghamjedcunningham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a number of nits I noticed while looking at the docker_context_files arg.

Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/build.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
Comment threaddocs/docker-stack/changelog.rst Outdated
@potiuk
potiukforce-pushed the inline-docker-scripts branch from eac66d0 to 058b989CompareMarch 24, 2022 07:27
@potiuk

Copy link
Copy Markdown
MemberAuthor

All language corrections by @jedcunningham fixed :). Also I think all the "checks" shoudl be fix and the build should succeed this time.

@potiuk

Copy link
Copy Markdown
MemberAuthor

Thanks @jedcunningham as usual :) ❤️

Comment threadscripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py Outdated
@Bowrna

Bowrna commented Mar 24, 2022

Copy link
Copy Markdown
Contributor

@potiuk Could you explain to me(or point to docs) how inlining the script will remove the permission problem? thank you

@potiuk

Copy link
Copy Markdown
MemberAuthor

When scripts are inlined, they are created by the docker engine COPY <<"EOF" does it. This means that they are created with the default permissions of the engine (always the same in all engines).

When the files were copied from the host (originally) permissions were copied from whatever was in the host. And this depended on umask setting in the host (and potentially on git configuration during the checkout). Practically, you could either have g+ or g- depending if your umask was 0002 or 0022 (those are most typical umask settings out there).

Additionally there was another problem on Windows. When you check out code on windows filesystem, you also loose executable bit. This we handled by explicitly adding +x when needed. In case of inlining we would have to so it anyway (for example you can see we do it for 'pip' inlined in Docker file).

@potiuk
potiukforce-pushed the inline-docker-scripts branch from 058b989 to 36f72feCompareMarch 24, 2022 17:54
@potiuk

Copy link
Copy Markdown
MemberAuthor

Now it shoudl be REALLY Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

Green :)

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to merge it. It will make our builds and Breeze Much faster with caching issues :)

This change is one of the biggest optimizations to the Dockerfiles
that from the very beginning was a goal, but it has been enabled
by switching to buildkit and recent relase of support for
the 1.4 dockerfile syntax. This syntax introduced two features:
* heredocs
* links for COPY commands
Both changes allows to solve multiple problems:
* COPY for build scripts suffer from permission problems. Depending
on umask setting of the host, the scripts could have different
group permissions and invalidate docker cache. Inlining the
scripts (automatically by pre-commit) gets rid of the problem
completely
* COPY --link allows to optimize and parallelize builds for
Dockerfile.ci embedded source code. This should speed up
not only building the images locally but also it will allow
to use more efficiently cache for the CI builds (in case no
source code change, the builds will use pre-cached layers from
the cache more efficiently (and in parallel)
* The PROD Dockerfile is now completely standalone. You do not
need to have any folders or files to build Airlfow image. At
the same time the versatility and support for multiple ways
on how you can build the image (as described in
https://airflow.apache.org/docs/docker-stack/build.html is
maintained (this was a goal from the very beginning of the
PROD Dockerfile but it was not easily achievable - heredocs
allow to inline scripts that are used for the build and the
pre-commits will make sure that there is one source of truth
and nicely editable scripts for both PROD and CI Dockerfile.
The last point is really cool, because it allows our users to
build custom dockerfiles without checking out the code of
Airflow, it is enough to download the latest released
Dockerfile and they can easily build the image.
Overall - this change will vastly optimize build speed for
both PROD and CI images in multiple scenarios.
@potiuk
potiukforce-pushed the inline-docker-scripts branch from 36f72fe to 5b8bbe4CompareMarch 26, 2022 21:28
@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd really love that one to be merged. Finishing AIP-26 will be way easier with it :) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-26+Production-ready+Airflow+Docker+Image

@potiuk

Copy link
Copy Markdown
MemberAuthor

I think we can merge this one (Regardless of the answer of legal).

@potiuk

Copy link
Copy Markdown
MemberAuthor

I'd love to get that one and #22225 in order to:

a) speed up all PRs by 10 minutes (cache)
b) make main succeed back (now all main builds are timing out on trying to build arm images with emulation.

@github-actionsgithub-actionsBot added the full tests needed We need to run full set of tests for this PR to merge label Mar 27, 2022
@github-actions

Copy link
Copy Markdown
Contributor

The PR most likely needs to run full matrix of tests because it modifies parts of the core of Airflow. However, committers might decide to merge it quickly and take the risk. If they don't merge it quickly - please rebase it to the latest main at your convenience, or amend the last commit of the PR, and push it with --force-with-lease.

@potiuk
potiuk merged commit 9cbab95 into apache:mainMar 27, 2022
@potiuk
potiuk deleted the inline-docker-scripts branch March 27, 2022 17:19
@BowrnaBowrna mentioned this pull request Mar 30, 2022
@ephraimbuddyephraimbuddy added the changelog:skip Changes that should be skipped from the changelog (CI, tests, etc..) label Apr 11, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-toolsarea:production-imageProduction image improvements and fixeschangelog:skipChanges that should be skipped from the changelog (CI, tests, etc..)full tests neededWe need to run full set of tests for this PR to mergekind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@potiuk@Bowrna@mik-laj@jedcunningham@ephraimbuddy