How to add user with dockerfile?
DockerDockerfileDocker 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 thatadduser
doesn't set a password just yet.
Without this optionadduser
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
inadduser
because Alpine only hasash
andsh
available. Both of these are just symlinks tobusybox
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 )