Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get /etc/profile to run automatically in Alpine / Docker

How can I get /etc/profile to run automatically when starting an Alpine Docker container interactively? I have added some aliases to an aliases.sh file and placed it in /etc/profile.d, but when I start the container using docker run -it [my_container] sh, my aliases aren't active. I have to manually type . /etc/profile from the command line each time.

Is there some other configuration necessary to get /etc/profile to run at login? I've also had problems with using a ~/.profile file. Any insight is appreciated!

EDIT:

Based on VonC's answer, I pulled and ran his example ruby container. Here is what I got:

$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 / # more /etc/profile.d/rubygems.sh export PATH=$PATH:/usr/lib/ruby/gems/2.0.0/bin / # env no_proxy=*.local, 169.254/16 HOSTNAME=6c7e93ebc5a1 SHLVL=1 HOME=/root TERM=xterm PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ / # exit 

Although the /etc/profile.d/rubygems.sh file exists, it is not being run when I login and my PATH environment variable is not being updated. Am I using the wrong docker run command? Is something else missing? Has anyone gotten ~/.profile or /etc/profile.d/ files to work with Alpine on Docker? Thanks!

like image 548
Jeff Kilbride Avatar asked Jun 25 '16 01:06

Jeff Kilbride


People also ask

How do you keep an alpine container running?

docker exec -it 5f4 sh / # (<-- you can run linux command here!) type exit to come out- You can run it in detached mode and it will keep running. You will need to STOP otherwise it will keep running. Show activity on this post.

Is Alpine Linux good for Docker?

Alpine Linux is a super lightweight Linux distribution that's useful for Docker containers. In this Docker and Alpine Linux tutorial, we'll build an Nginx web server that demonstrates how small a Docker container image can be.


2 Answers

The default shell in Alpine Linux is ash.

Ash will only read the /etc/profile and ~/.profile files if it is started as a login shell sh -l.

To force Ash to source the /etc/profile or any other script you want upon its invocation as a non login shell, you need to setup an environment variable called ENV before launching Ash.

e.g. in your Dockerfile

FROM alpine:3.5  ENV ENV="/root/.ashrc"  RUN echo "echo 'Hello, world!'" > "$ENV" 

When you build that you get:

deployer@ubuntu-1604-amd64:~/blah$ docker build --tag test . Sending build context to Docker daemon  2.048kB Step 1/3 : FROM alpine:3.5 3.5: Pulling from library/alpine 627beaf3eaaf: Pull complete Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 Status: Downloaded newer image for alpine:3.5  ---> 4a415e366388 Step 2/3 : ENV ENV "/root/.ashrc"  ---> Running in a9b6ff7303c2  ---> 8d4af0b7839d Removing intermediate container a9b6ff7303c2 Step 3/3 : RUN echo "echo 'Hello, world!'" > "$ENV"  ---> Running in 57c2fd3353f3  ---> 2cee6e034546 Removing intermediate container 57c2fd3353f3 Successfully built 2cee6e034546 

Finally, when you run the newly generated container, you get:

deployer@ubuntu-1604-amd64:~/blah$ docker run -ti test /bin/sh Hello, world! / # exit 

Notice the Ash shell didn't run as a login shell.

So to answer your query, replace

ENV ENV="/root/.ashrc" 

with:

ENV ENV="/etc/profile" 

and Alpine Linux's Ash shell will automatically source the /etc/profile script each time the shell is launched.

Gotcha: /etc/profile is normally meant to only be sourced once! So, I would advise that you don't source it and instead source a /root/.somercfile instead.

Source: https://stackoverflow.com/a/40538356

like image 147
Jinesh Choksi Avatar answered Sep 22 '22 06:09

Jinesh Choksi


You still can try in your Dockerfile a:

RUN echo '\         . /etc/profile ; \     ' >> /root/.profile 

(assuming the current user is root. If not, replace /root with the full home path)

That being said, those /etc/profile.d/xx.sh should run.
See codeclimate/docker-alpine-ruby as an example:

COPY files / 

With 'files/etc" including an files/etc/profile.d/rubygems.sh running just fine.


In the OP project Dockerfile, there is a

COPY aliases.sh /etc/profile.d/ 

But the default shell is not a login shell (sh -l), which means profile files (or those in /etc/profile.d) are not sourced.

Adding sh -l would work:

docker@default:~$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 sh -l 87a58e26b744:/# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/ruby/gems/2.0.0/bin 
like image 42
VonC Avatar answered Sep 18 '22 06:09

VonC