anyway to setup npm credentials over `npm login` without reading input from STDIN?

I’m trying to automate npm publish inside a docker container but I got trouble when $npm login command tries to read username and email from prompts:

npm login << EOF

it works in terminal bash but not in container without STDIN open and show the following error message:

  • export the IBM Docker container images in the registry
  • Is it possible to add multiple source files in dokker.json?
  • Cannot connect to Jenkins docker container running inside Vagrant on Mac
  • How to do local development with Kubernetes?
  • Generating dockerfile of a gradle java application
  • Commit data in a mysql container
  • Username: Password: npm ERR! cb() never called!
    npm ERR! not ok code 0

    According to npm-adduser:

    The username, password, and email are read in from prompts.

    So how can I run npm login without STDIN open?

  • unbale to install glusterfs driver on Mac OS 10.11.6 Docker version 1.13.0
  • Freegeoip with Docker Cloud
  • Purge process_execution, instance and instance_label_map data?
  • file permission and ownership Elastic Beanstalk Multicontainer Docker Environments aws
  • Caching Maven parent in offline build
  • Cannot validate certificate for ip because it doesn't contain any IP SANs
  • 4 Solutions collect form web for “anyway to setup npm credentials over `npm login` without reading input from STDIN?”

    TL;DR: Make an HTTP request directly to the registry:

    TOKEN=$(curl -s \
      -H "Accept: application/json" \
      -H "Content-Type:application/json" \
      -X PUT --data '{"name": "username_here", "password": "password_here"}' \
      http://your_registry/-/user/org.couchdb.user:username_here 2>&1 | grep -Po \
      '(?<="token": ")[^"]*')
    npm set registry "http://your_registry"
    npm set //your_registry/:_authToken $TOKEN


    Behind the scenes npm adduser makes an HTTP request to the registry. Instead of forcing adduser to behave the way you want, you could make the request directly to the registry without going through the cli and then set the auth token with npm set.

    The source code suggests that you could make a PUT request to http://your_registry/-/user/org.couchdb.user:your-username with the following payload

      name: username,
      password: password

    and that would create a new user in the registry.

    Many thanks to @shawnzhu for having found a more cleaner approach to solve the problem.

    An expect script worked for me. You need to make sure expect is installed, this command should do it for ubuntu:

    apt-get install expect-dev

    Your script could look something like this (npm_login_expect):

    #!/usr/bin/expect -f
    # set our args into variables
    set i 0; foreach n $argv {set "p[incr i]" $n}
    set timeout 60
    #npm login command, add whatever command-line args are necessary
    spawn npm login
    match_max 100000
    expect "Username"    
    send "$p1\r"
    expect "Password"
    send "$p2\r" 
    expect "Email"
    send "$p3\r"
    expect {
       timeout      exit 1

    And then call it like this:

    expect -f npm_login_expect myuser mypassword ""

    You could use an expect script instead or write a node script that uses pty.js.

    For the solution 2 exposed by ke_wa in this duplicated post has worked.


    export NPM_USERNAME=mUs34
    export NPM_PASSWORD=mypassW0rD
    npm adduser<<!
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.