How to add user with dockerfile?

DockerDockerfile

Docker Problem Overview


How can I add a user with Dockerfile - the following does not work.

USER vault
WORKDIR /usr/local/bin/vault

My full Dockerfile:

FROM alpine:3.4
RUN apk update && apk add curl unzip
RUN useradd -ms /bin/bash vault

USER vault
WORKDIR /usr/local/bin/vault
ADD /vault.hcl /etc/vault/vault.hcl

RUN curl -SL https://releases.hashicorp.com/vault/0.5.0/vault_0.5.0_linux_amd64.zip > vault.zip
RUN unzip vault.zip -d /usr/local/bin && rm vault.zip

Docker Solutions


Solution 1 - Docker

Use useradd instead of its interactive adduser to add user.

RUN useradd -ms /bin/bash  vault

Below command will not create user .

USER vault
WORKDIR /usr/local/bin/vault

it will use vault user

please Refer Dockerfile User Documentation

> The USER instruction sets the user name or UID to use when running the > image and for any RUN, CMD and ENTRYPOINT instructions that follow it > in the Dockerfile.

NOTE : Ensures that bash is the default shell.

If default shell is /bin/sh you can do like:

RUN ln -sf /bin/bash /bin/sh
RUN useradd -ms /bin/bash  vault

Solution 2 - Docker

To add group and to associate a new user, use code below.

FROM <base image>
RUN groupadd -g 2000 go \
&& useradd -m -u 2001 -g go go
USER go

OR

RUN addgroup -g 1001 -S appuser && adduser -u 1001 -S appuser  -G appuser 

Solution 3 - Docker

If you also want your user to have a password, use this for Alpine based-images:

FROM alpine
ARG USER=usernameThatYouWant
ARG PASS="some password"
RUN adduser -D $USER && echo "$USER:$PASS" | chpasswd
  • The ARG lines are there so you can (optionally) choose another username and password when building the image (without having to change the Dockerfile).
  • -D so that adduser doesn't set a password just yet.
    Without this option adduser would become interactive and ask for a password. It doesn't accept this from the regular STDIN, so piping the password is also not an option.
  • echo "$USER:$PASS" | chpasswd to finally set the password.
  • Note that I do not set a shell with -s /path/to/some/shell in adduser because Alpine only has ash and sh available. Both of these are just symlinks to busybox anyway.
    (But if you are going to install another shell in your image you probably do want to use it.)

For Ubuntu-based images use this:

FROM ubuntu
ARG USER=usernameThatYouWant
ARG PASS="some password"
RUN useradd -m -s /bin/bash $USER && echo "$USER:$PASS" | chpasswd

I am using:

  • useradd because here this is the program for non-interactive usage.
  • -m so that we the user has a homedir.
  • -s /bin/bash so that the user has bash as default shell.

(For most other base-images you will also need to use the Ubuntu-method )

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAtlantic0View Question on Stackoverflow
Solution 1 - Dockerpl_rockView Answer on Stackoverflow
Solution 2 - DockerRenato CoutinhoView Answer on Stackoverflow
Solution 3 - DockerGaroView Answer on Stackoverflow