Skip to content

Commit 7282bf5

Browse files
authored
Merge pull request #1955 from etungsten/registry-credentials
models, containerd, ecs-agent, host-ctr: support registry credentials
2 parents 92bdb47 + 6f59a59 commit 7282bf5

File tree

27 files changed

+455
-60
lines changed

27 files changed

+455
-60
lines changed

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,30 @@ When pulling an image from a registry, the container runtime will try the endpoi
453453
454454
For [host-container](#host-containers-settings) and [bootstrap-container](#bootstrap-containers-settings) images from Amazon ECR private repositories, registry mirrors are currently unsupported.
455455
456+
The following setting is optional and allows you to configure image registry credentials.
457+
* `settings.container-registry.credentials`: An array of container images registry credential settings. Each element specifies the registry and the credential information for said registry.
458+
The credential fields map to [containerd's registry credential fields](https://github.com/containerd/containerd/blob/v1.6.0/docs/cri/registry.md#configure-registry-credentials), which in turn map to the fields in `.docker/config.json`.
459+
It is recommended to programmatically set these settings via `apiclient` through the Bottlerocket control container and/or custom host-containers.
460+
* An example `apiclient` call to set registry credentials for `gcr.io` and `docker.io` looks like this:
461+
```bash
462+
apiclient set --json '{
463+
"container-registry": {
464+
"credentials": [
465+
{
466+
"registry": "gcr.io",
467+
"username": "example_username",
468+
"password": "example_password"
469+
},
470+
{
471+
"registry": "docker.io",
472+
"auth": "example_base64_encoded_auth_string"
473+
}
474+
]
475+
}
476+
}'
477+
```
478+
In addition to the container runtime daemons, these credential settings will also apply to [host-container](#host-containers-settings) and [bootstrap-container](#bootstrap-containers-settings) image pulls as well.
479+
456480
#### Updates settings
457481

458482
* `settings.updates.metadata-base-url`: The common portion of all URIs used to download update metadata.

Release.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,6 @@ version = "1.6.1"
103103
"(1.6.0, 1.6.1)" = []
104104
"(1.6.1, 1.6.2)" = [
105105
"migrate_v1.6.2_add-cfsignal.lz4",
106+
"migrate_v1.6.2_container-registry-credentials.lz4",
107+
"migrate_v1.6.2_container-registry-credentials-metadata.lz4",
106108
]

packages/containerd/containerd-config-toml_k8s

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,25 @@ conf_dir = "/etc/cni/net.d"
3737
endpoint = [{{join_array ", " endpoint }}]
3838
{{/each}}
3939
{{/if}}
40+
41+
{{#if settings.container-registry.credentials}}
42+
{{#each settings.container-registry.credentials}}
43+
{{#if (eq registry "docker.io" )}}
44+
[plugins."io.containerd.grpc.v1.cri".registry.configs."registry-1.docker.io".auth]
45+
{{else}}
46+
[plugins."io.containerd.grpc.v1.cri".registry.configs."{{registry}}".auth]
47+
{{/if}}
48+
{{#if username}}
49+
username = "{{{username}}}"
50+
{{/if}}
51+
{{#if password}}
52+
password = "{{{password}}}"
53+
{{/if}}
54+
{{#if auth}}
55+
auth = "{{{auth}}}"
56+
{{/if}}
57+
{{#if identitytoken}}
58+
identitytoken = "{{{identitytoken}}}"
59+
{{/if}}
60+
{{/each}}
61+
{{/if}}

packages/containerd/containerd-config-toml_k8s_nvidia

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,25 @@ conf_dir = "/etc/cni/net.d"
3737
endpoint = [{{join_array ", " endpoint }}]
3838
{{/each}}
3939
{{/if}}
40+
41+
{{#if settings.container-registry.credentials}}
42+
{{#each settings.container-registry.credentials}}
43+
{{#if (eq registry "docker.io" )~}}
44+
[plugins."io.containerd.grpc.v1.cri".registry.configs."registry-1.docker.io".auth]
45+
{{else}}
46+
[plugins."io.containerd.grpc.v1.cri".registry.configs."{{registry}}".auth]
47+
{{/if}}
48+
{{#if username}}
49+
username = "{{{username}}}"
50+
{{/if}}
51+
{{#if password}}
52+
password = "{{{password}}}"
53+
{{/if}}
54+
{{#if auth}}
55+
auth = "{{{auth}}}"
56+
{{/if}}
57+
{{#if identitytoken}}
58+
identitytoken = "{{{identitytoken}}}"
59+
{{/if}}
60+
{{/each}}
61+
{{/if}}

packages/containerd/containerd.spec

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ Source2: containerd-config-toml_k8s
2020
Source3: containerd-config-toml_basic
2121
Source4: containerd-config-toml_k8s_nvidia
2222
Source5: containerd-tmpfiles.conf
23+
24+
# Mount for writing containerd configuration
25+
Source100: etc-containerd.mount
26+
2327
Source1000: clarify.toml
2428

2529
# TODO: submit this upstream, including a unit test.
@@ -72,7 +76,7 @@ do
7276
done
7377

7478
install -d %{buildroot}%{_cross_unitdir}
75-
install -p -m 0644 %{S:1} %{buildroot}%{_cross_unitdir}/containerd.service
79+
install -p -m 0644 %{S:1} %{S:100} %{buildroot}%{_cross_unitdir}
7680

7781
install -d %{buildroot}%{_cross_templatedir}
7882
install -d %{buildroot}%{_cross_factorydir}%{_cross_sysconfdir}/containerd
@@ -93,6 +97,7 @@ install -p -m 0644 %{S:5} %{buildroot}%{_cross_tmpfilesdir}/containerd.conf
9397
%{_cross_bindir}/containerd-shim-runc-v2
9498
%{_cross_bindir}/ctr
9599
%{_cross_unitdir}/containerd.service
100+
%{_cross_unitdir}/etc-containerd.mount
96101
%dir %{_cross_factorydir}%{_cross_sysconfdir}/containerd
97102
%{_cross_templatedir}/containerd-config-toml*
98103
%{_cross_tmpfilesdir}/containerd.conf
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[Unit]
2+
Description=Containerd Configuration Directory (/etc/containerd)
3+
DefaultDependencies=no
4+
Conflicts=umount.target
5+
Before=local-fs.target umount.target
6+
After=selinux-policy-files.service
7+
Wants=selinux-policy-files.service
8+
9+
[Mount]
10+
What=tmpfs
11+
Where=/etc/containerd
12+
Type=tmpfs
13+
Options=nosuid,nodev,noexec,noatime,context=system_u:object_r:secret_t:s0
14+
15+
[Install]
16+
WantedBy=preconfigured.target

packages/ecs-agent/ecs-agent.spec

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ Source108: pause-repositories
4242
# Bottlerocket-specific - version data can be set with linker options
4343
Source109: version.go
4444

45+
# Mount for writing ECS agent configuration
46+
Source200: etc-ecs.mount
47+
4548
# Patches are numbered according to which source they apply to
4649
# Patches 0000 - 0999 apply to Source0
4750
# Patches 1000 - 1999 apply to Source1
@@ -241,7 +244,9 @@ install -D -p -m 0755 %{ecscni_gorepo}-%{ecscni_gitrev}/ecs-eni %{buildroot}%{_c
241244
install -D -p -m 0755 %{ecscni_gorepo}-%{ecscni_gitrev}/ecs-ipam %{buildroot}%{_cross_libexecdir}/amazon-ecs-agent/ecs-ipam
242245
install -D -p -m 0755 %{vpccni_gorepo}-%{vpccni_gitrev}/vpc-branch-eni %{buildroot}%{_cross_libexecdir}/amazon-ecs-agent/vpc-branch-eni
243246

244-
install -D -p -m 0644 %{S:101} %{buildroot}%{_cross_unitdir}/ecs.service
247+
install -d %{buildroot}%{_cross_unitdir}
248+
install -D -p -m 0644 %{S:101} %{S:200} %{buildroot}%{_cross_unitdir}
249+
245250
install -D -p -m 0644 %{S:102} %{buildroot}%{_cross_tmpfilesdir}/ecs.conf
246251
install -D -p -m 0644 %{S:103} %{buildroot}%{_cross_sysctldir}/90-ecs.conf
247252
install -D -p -m 0644 %{S:104} %{buildroot}%{_cross_templatedir}/ecs.config
@@ -288,6 +293,7 @@ mv %{vpccni_gorepo}-%{vpccni_gitrev}/vendor go-vendor/%{vpccni_gorepo}
288293
%{_cross_libexecdir}/amazon-ecs-agent/ecs-ipam
289294
%{_cross_libexecdir}/amazon-ecs-agent/vpc-branch-eni
290295
%{_cross_unitdir}/ecs.service
296+
%{_cross_unitdir}/etc-ecs.mount
291297
%{_cross_tmpfilesdir}/ecs.conf
292298
%{_cross_sysctldir}/90-ecs.conf
293299
%{_cross_templatedir}/ecs.config

packages/ecs-agent/ecs.config

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,18 @@
11
ECS_LOGFILE=/var/log/ecs/ecs-agent.log
22
ECS_LOGLEVEL="{{settings.ecs.loglevel}}"
3+
{{#if settings.container-registry.credentials~}}
4+
ECS_ENGINE_AUTH_TYPE=dockercfg
5+
ECS_ENGINE_AUTH_DATA='{
6+
{{~#each settings.container-registry.credentials~}}
7+
{{~#unless @first~}},{{~/unless~}}
8+
{{~#if (eq registry "docker.io" )~}}
9+
"https://index.docker.io/v1/":
10+
{{~else~}}
11+
"{{registry}}":
12+
{{~/if~}}
13+
{"email": "."
14+
{{~#if auth~}},"auth": "{{{auth}}}"{{/if}}
15+
{{~#if username~}},"username": "{{{username}}}"{{/if}}
16+
{{~#if password~}},"password": "{{{password}}}"}{{/if}}
17+
{{~/each~}}}}'
18+
{{/if}}

packages/ecs-agent/etc-ecs.mount

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[Unit]
2+
Description=ECS agent Configuration Directory (/etc/ecs)
3+
DefaultDependencies=no
4+
Conflicts=umount.target
5+
Before=local-fs.target umount.target
6+
After=selinux-policy-files.service
7+
Wants=selinux-policy-files.service
8+
9+
[Mount]
10+
What=tmpfs
11+
Where=/etc/ecs
12+
Type=tmpfs
13+
Options=nosuid,nodev,noexec,noatime,context=system_u:object_r:secret_t:s0
14+
15+
[Install]
16+
WantedBy=preconfigured.target

packages/host-ctr/clarify.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[clarify."sigs.k8s.io/yaml"]
2+
expression = "MIT AND BSD-3-Clause"
3+
license-files = [
4+
{ path = "LICENSE", hash = 0xcdf3ae00 },
5+
]

0 commit comments

Comments
 (0)