-
Notifications
You must be signed in to change notification settings - Fork 389
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
Support dynamic push credentials obtained from registry #1724
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -91,6 +91,18 @@ class BuildExecutor(LoggingConfigurable): | |
config=True, | ||
) | ||
|
||
push_secret_content = Unicode( | ||
"", | ||
help=( | ||
"Content of an implementation dependent secret for pushing image to a registry. " | ||
"For example, if push tokens are temporary this can be used to pass the token " | ||
"as an environment variable CONTAINER_ENGINE_REGISTRY_CREDENTIALS to " | ||
"repo2docker." | ||
"If provided this will be used instead of push_secret." | ||
), | ||
config=True, | ||
) | ||
|
||
memory_limit = ByteSpecification( | ||
0, | ||
help="Memory limit for the build process in bytes (optional suffixes K M G T).", | ||
|
@@ -394,7 +406,23 @@ def submit(self): | |
) | ||
] | ||
|
||
if self.push_secret: | ||
env = [ | ||
client.V1EnvVar(name=key, value=value) | ||
for key, value in self.extra_envs.items() | ||
] | ||
if self.git_credentials: | ||
env.append( | ||
client.V1EnvVar(name="GIT_CREDENTIAL_ENV", value=self.git_credentials) | ||
) | ||
|
||
if self.push_secret_content: | ||
env.append( | ||
client.V1EnvVar( | ||
name="CONTAINER_ENGINE_REGISTRY_CREDENTIALS", | ||
consideRatio marked this conversation as resolved.
Show resolved
Hide resolved
|
||
value=self.push_secret_content, | ||
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. This is less secure than the KubeSpawner has ended up dynamically creating also a k8s Secret for user pods to house misc information, for example info relevant for internal_ssl. It certainly adds complexity to do that, and this is far less complicated. I think it may be acceptable to do this if we describe it clearly in the help string of the config. 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 agree it's not as good as using a secret, however we had a long discussion in #1577 over the pros and cons of dynamically creating secrets attached to pods, as the same problem arises with dynamic Git credentials. |
||
) | ||
) | ||
elif self.push_secret: | ||
volume_mounts.append( | ||
client.V1VolumeMount(mount_path="/root/.docker", name="docker-config") | ||
) | ||
|
@@ -405,15 +433,6 @@ def submit(self): | |
) | ||
) | ||
|
||
env = [ | ||
client.V1EnvVar(name=key, value=value) | ||
for key, value in self.extra_envs.items() | ||
] | ||
if self.git_credentials: | ||
env.append( | ||
client.V1EnvVar(name="GIT_CREDENTIAL_ENV", value=self.git_credentials) | ||
) | ||
|
||
self.pod = client.V1Pod( | ||
metadata=client.V1ObjectMeta( | ||
name=self.name, | ||
|
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.
Overall, the
push_secret
config has been challenging for me to understand well. Here are some notes on what I think can help.push_secret
references a name (k8s Secret resource for example) as compared to content to put inside one.Thinking about what I'd appreciate from docs to understand this good enough, I'd say something like the following, where its not obvious whats in scope and not for this PR:
push_secret
andpush_secret_content
's help strings are both are updated to reflect that there are separate ways of providing container registry credentials to the builder, wherepush_secret
references something existing by name, andpush_secret_content
is content.push_secret
andpush_secret_content
's help strings are both are updated on how to know what kind of resource to reference and what content to provide. This may be implementation dependent and not something BuildExecutor can know, but I think we can declare here where to find that kind of details.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'll update the docs. AFAIK it should be fine to duplicate the traitlet in the subclass to have more specialist documentation?
If it's easier (I'm not sure whether it is), we could switch
push_secret
to be of type(Unicode, Dict)
. where Dict would for example take the form{content: <secret>}
or{secret_name: <k8s-secret-name>}
.Unicode
would support the current default behaviour.