blob: 72662a87aeb1f2be65dbbf8f6057dc088f2510a5 [file] [log] [blame] [view]
# docker-credential-gcloud-proxy.py
This is a wrapper script around the `docker-credential-gcloud` program, which is installed by the
[Google Cloud SDK](https://cloud.google.com/sdk). It pipes through its stdin and command-line
arguments to `docker-credential-gcloud`, logs `docker-credential-gcloud`'s arguments, stdin,
stdout, stderr and exit code to a file on disk, and emits the stdout, stderr and exit code back to
the parent process.
The purpose of this script is to debug Docker authorization issues on GCE machines.
## Usage
This script replaces `/usr/bin/docker-credential-gcloud`, which is a symlink to
`/usr/lib/google-cloud-sdk/bin/docker-credential-gcloud`.
First, install this script on a machine with `install.sh`, e.g.:
```
$ install.sh skia-e-gce-234
```
The `install.sh` script will delete the `/usr/bin/docker-credential-gcloud` symlink and copy
`docker-credential-gcloud-proxy.py` as `/usr/bin/docker-credential-gcloud` on the machine.
Then, wait for a Docker task to run on that machine. Any interactions with
`docker-credential-gcloud` will be logged in `/docker-credential-gcloud-proxy.log`. Logs for
multiple invocations will be appended to said file.
Once you're finished, use `uninstall.sh` to restore the original `docker-credential-gcloud` program
and delete the log file, e.g.:
```
$ uninstall.sh skia-e-gce-234
```
This will delete `/docker-credential-gcloud-proxy.log` and `/usr/bin/docker-credential-gcloud`, and
will restore the latter as a symlink to `/usr/lib/google-cloud-sdk/bin/docker-credential-gcloud`.
## How Docker authorization works
The `docker` command reads file `$HOME/.docker/config.json` to get the credentials needed to
interact with container registries.
[Google Container Registry](https://cloud.google.com/container-registry) users typically run the
`gcloud auth configure-docker` command to get their credentials, which populates
`$HOME/.docker/config.json` with the following contents:
```
{
"credHelpers": {
"gcr.io": "gcloud",
"us.gcr.io": "gcloud",
"eu.gcr.io": "gcloud",
"asia.gcr.io": "gcloud",
"staging-k8s.gcr.io": "gcloud",
"marketplace.gcr.io": "gcloud"
}
}
```
[Credential helpers](https://docs.docker.com/engine/reference/commandline/login/#credential-helpers)
are programs that can provide credentials for specific registries. When a user tries to e.g. pull
an image from a registry with the `docker` command, `docker` will look for a "credHelpers"
key/value pair where the key corresponds to the registry, and it will invoke a credential helper
named `docker-credential-<value>` to get credentials for that registry. For example, for an entry
such as `"gcr.io": "gcloud"` in the above `config.json` file, `docker` will invoke a credential
helper named `docker-credential-gcloud`.
Credential helpers follow a simple
[protocol](https://docs.docker.com/engine/reference/commandline/login/#credential-helper-protocol).
They take a command-line argument to identify the action (either `store`, `get` or `erase`), and
they take a payload via stdin. The `get` action takes a string payload with the server address that
docker needs credentials for, e.g.:
```
$ echo gcr.io | docker-credential-gcloud get
{
"Secret": "...",
"Username": "_dcgcloud_token"
}
```