| # 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" |
| } |
| ``` |