-
Notifications
You must be signed in to change notification settings - Fork 595
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Ignore the exit code of modprobe
always
#468
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -143,17 +143,46 @@ if [ "$1" = 'dockerd' ]; then | |
# XXX inject "docker-init" (tini) as pid1 to workaround https://github.com/docker-library/docker/issues/318 (zombie container-shim processes) | ||
set -- docker-init -- "$@" | ||
|
||
if ! iptables -nL > /dev/null 2>&1; then | ||
iptablesLegacy= | ||
if [ -n "${DOCKER_IPTABLES_LEGACY+x}" ]; then | ||
# let users choose explicitly to legacy or not to legacy | ||
iptablesLegacy="$DOCKER_IPTABLES_LEGACY" | ||
if [ -n "$iptablesLegacy" ]; then | ||
modprobe ip_tables || : | ||
else | ||
modprobe nf_tables || : | ||
fi | ||
elif ( | ||
# https://git.netfilter.org/iptables/tree/iptables/nft-shared.c?id=f5cf76626d95d2c491a80288bccc160c53b44e88#n420 | ||
# https://github.com/docker-library/docker/pull/468#discussion_r1442131459 | ||
for f in /proc/net/ip_tables_names /proc/net/ip6_tables_names /proc/net/arp_tables_names; do | ||
if b="$(cat "$f")" && [ -n "$b" ]; then | ||
exit 0 | ||
fi | ||
done | ||
exit 1 | ||
); then | ||
# if we already have any "legacy" iptables rules, we should always use legacy | ||
iptablesLegacy=1 | ||
elif ! iptables -nL > /dev/null 2>&1; then | ||
# if iptables fails to run, chances are high the necessary kernel modules aren't loaded (perhaps the host is using xtables, for example) | ||
# https://github.com/docker-library/docker/issues/350 | ||
# https://github.com/moby/moby/issues/26824 | ||
# https://github.com/docker-library/docker/pull/437#issuecomment-1854900620 | ||
if ! modprobe nf_tables; then | ||
modprobe nf_tables || : | ||
if ! iptables -nL > /dev/null 2>&1; then | ||
# might be host has no nf_tables, but Alpine is all-in now (so let's try a legacy fallback) | ||
modprobe ip_tables || : | ||
# see https://github.com/docker-library/docker/issues/463 (and the dind Dockerfile where this directory is set up) | ||
export PATH="/usr/local/sbin/.iptables-legacy:$PATH" | ||
if /usr/local/sbin/.iptables-legacy/iptables -nL > /dev/null 2>&1; then | ||
iptablesLegacy=1 | ||
fi | ||
fi | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When host has both
Something like this worked for me to detect that case and use
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, interesting! Any idea in what situations/use cases a fresh network namespace might have legacy tables set up in it already? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I found the code in It's effectively "read from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Did some more testing and figured this out -- it turns out that on CentOS 7, 8637e230c491:/# test -s /proc/net/ip_tables_names; echo $?
1
8637e230c491:/# stat /proc/net/ip_tables_names
File: /proc/net/ip_tables_names
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 29h/41d Inode: 4026532469 Links: 1
Access: (0440/-r--r-----) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-01-04 18:43:59.112212543 +0000
Modify: 2024-01-04 18:43:59.112212543 +0000
Change: 2024-01-04 18:43:59.112212543 +0000
8637e230c491:/# cat /proc/net/ip_tables_names
nat
mangle
security
raw
filter (so my |
||
fi | ||
if [ -n "$iptablesLegacy" ]; then | ||
# see https://github.com/docker-library/docker/issues/463 (and the dind Dockerfile where this directory is set up) | ||
export PATH="/usr/local/sbin/.iptables-legacy:$PATH" | ||
fi | ||
iptables --version # so users can see whether it's legacy or not | ||
|
||
uid="$(id -u)" | ||
if [ "$uid" != '0' ]; then | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I didn't actually test this before I pushed it, but now I have: 😅
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Giving users the opportunity to decide for themselves is the best option I think.