在Bash脚本中实现自动Docker登录

54

如何在脚本中预设我的凭据以在docker login命令中进行身份验证?

我正在使用一个Bash脚本,基本上自动化了整个设置自定义VM等过程,但当我需要在脚本内登录到Docker以拉取镜像时,我会收到以下错误:

  

用户名:FATA [0000]不适当的ioctl设备


我使用的命令是以下命令:

( echo "xxx"; echo "yyy"; echo "zzz" ) | docker login docker.somesite.org


如何在不使用和复制现有的.dockercfg文件的情况下实现这一点,谢谢。


你需要使用expect/pexpect。 - James Mills
5个回答

112

Docker 18以及更高版本

现在有一个官方记录的方法来实现这个:

cat ~/my_password.txt | docker login --username foo --password-stdin

Docker 1.11到Docker 17

您可以在命令行中传递所有参数:

docker login --username=$DOCKER_USER --password=$DOCKER_PASS $DOCKER_HOST

如果您没有指定DOCKER_HOST,您将获得主要的Docker仓库。如果省略任何参数,则会提示输入该参数。

早于1.11版本

与上文路径相同,但您还需要传递一个--email标志。实际上不会检查其内容,因此任何内容都可以:

docker login --username=$DOCKER_USER --password=$DOCKER_PASS $DOCKER_HOST --email whale@docker.com

5
简写可能更方便: docker login -u $DOCKER_USER -p $DOCKER_PASS -m $DOCKER_EMAIL $DOCKER_HOST (说明:这是一条Docker命令,表示登录到指定的Docker注册表。$DOCKER_USER是您的Docker用户名,$DOCKER_PASS是您的密码,$DOCKER_EMAIL是关联的电子邮件地址,$DOCKER_HOST是Docker注册表的主机名。) - antonbormotov
5
这是个偏好问题,但当我写脚本时,我更喜欢使用长选项,因为它有自我记录的功能,并且简洁并不能带来什么优势。(相比于在命令行中需要节约击键次数和避免换行的考虑。) - Nathaniel Waisbrot
@JasonHeiss 你可以手动登录,然后获取令牌,然后自己创建 ~/.docker/config.json 文件。但是 Docker Hub 实际上没有为程序化使用创建和销毁令牌的系统。 - Nathaniel Waisbrot
从Docker 1.11.0开始,使用--email已被弃用,并将在1.14中删除。上述示例仍然有效,除了该参数。 - meatspace
现在Docker会警告在机器上以未加密的方式存储密码,如果设置了凭据存储,是否可能进行无人值守的Docker登录?目前,在Linux上使用pass时,它会要求输入GPG私钥的密码短语。是否可以在没有用户干预的情况下提供密码短语? - alvarez
显示剩余3条评论

18
为了非交互式运行docker login命令,您可以设置--password-stdin标志,通过STDIN提供密码。使用STDIN可以防止密码出现在shell历史记录或日志文件中。
$ echo $DOCKER_PASS | docker login -u$DOCKER_USER --password-stdin $DOCKER_HOST

8
当您登录到私有仓库时,Docker会自动创建一个文件$HOME/.docker/config.json。该文件包含凭据信息,因此您可以保存该文件并将其复制到任何主机以便在需要登录仓库时使用。
文件内容如下:
{
     "auths": {
                   "example.com": {
                                    "auth": "xxxxxxxxxxxxxxxxxxxxxxx"
                    }
            }
 }

插件如果您想在一个服务器上登录多个Docker注册表,只需添加另一个身份验证信息,例如:

{
     "auths": {
                   "example.com": {
                                    "auth": "xxxxxxxxxxxxxxxxxxxxxxx"
                    },
                    "example1.com":{
                                    "auth": "xxxxxxxxxxxxxxxxxxxxxxx"
                    }
            }
 }

现在您可以从example.com和example1.com推送和拉取图像。

仍然显示正在使用现有凭据进行身份验证... 警告!您的密码将以未加密的形式存储在 /home/user/.docker/config.json 中。 配置凭据助手以消除此警告。请参见 https://docs.docker.com/engine/reference/commandline/login/#credentials-store您确定要继续吗?[y/N] - Vasili Pascal
感谢 Henri Siponen 在 https://dev59.com/w2kv5IYBdhLWcg3wnB87 上的回答,我通过添加以下内容成功解决了问题: echo "y" | docker login myregistry.com - Vasili Pascal

2

如果有任何路过的人偶然发现这篇文章,想要在Openshift环境的容器注册表(Docker)中使用它,您可以使用以下方法提供注册表URI以及使用Openshift令牌登录的凭据。

最初的回答:

$ echo "$(oc whoami -t)" | docker login -u $USER --password-stdin \
    $(oc get route docker-registry -n default --no-headers | awk '{print $2}')
Login Succeeded

上述操作包括三个步骤:
  • Passes token retrieved from Openshift oc whoami -t
  • Determines Openshift's registry URI

    $(oc get route docker-registry -n default --no-headers | awk '{print $2}'`)
    
  • Logs into registry using $USER + token from above


0

我曾经遇到过这个问题,想要补充一下,环境变量DOCKER_HOST对于docker来说具有特殊意义,用于定义它连接的守护进程套接字,导致登录失败。这里有docker使用的所有环境变量的完整列表:https://docs.docker.com/engine/reference/commandline/cli/

我将我的环境变量更改为其他内容,例如REG_,然后它就可以工作了。

docker login --username $REG_USERNAME --password $REG_PASSWORD $REG_HOST

请注意,如果您在GitLab Runner中执行此操作,则无需使用--password-stdin标志,如果您已经使用变量掩码(您可以使用,但没有必要)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接