web-dev-qa-db-fra.com

Comment faire pour que / etc / profile s'exécute automatiquement dans Alpine / Docker

Comment puis-je avoir /etc/profile pour s'exécuter automatiquement lors du démarrage interactif d'un conteneur Alpine Docker? J'ai ajouté des alias à un aliases.sh fichier et l'a placé dans /etc/profile.d, mais lorsque je démarre le conteneur à l'aide de docker run -it [my_container] sh, mes alias ne sont pas actifs. Je dois taper manuellement . /etc/profile à partir de la ligne de commande à chaque fois.

Y a-t-il une autre configuration nécessaire pour obtenir /etc/profile à exécuter lors de la connexion? J'ai également eu des problèmes avec l'utilisation d'un ~/.profile fichier. Toute idée est appréciée!

MODIFIER:

Sur la base de la réponse de VonC, j'ai tiré et exécuté son exemple de conteneur Ruby. Voici ce que j'ai obtenu:

$ 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

Bien que le /etc/profile.d/rubygems.sh le fichier existe, il n'est pas exécuté lorsque je me connecte et ma variable d'environnement PATH n'est pas mise à jour. Suis-je en utilisant le mauvais docker run commande? Manque-t-il autre chose? Quelqu'un at-il obtenu ~/.profile ou /etc/profile.d/ fichiers pour travailler avec Alpine sur Docker? Merci!

22
Jeff Kilbride

Vous pouvez toujours essayer dans votre Dockerfile:

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

(en supposant que l'utilisateur actuel est root. Sinon, remplacez /root avec le chemin d'accès complet)

Cela étant dit, ces /etc/profile.d/xx.sh devraient s'exécuter.
Voir codeclimate/docker-Alpine-Ruby à titre d'exemple:

COPY files /

Avec ' files/etc "incluant un files/etc/profile.d/rubygems.sh fonctionne très bien.


Dans le projet OPDockerfile , il y a un

COPY aliases.sh /etc/profile.d/

Mais le Shell par défaut n'est pas un Shell de connexion (sh -l), ce qui signifie profile fichiers (ou ceux de /etc/profile.d) ne proviennent pas .

Ajouter sh -l travaillerait:

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
18
VonC

Le Shell par défaut dans Alpine Linux est ash.

Ash ne lira que le /etc/profile et ~/.profile fichiers s'il est démarré en tant que shell de connexion sh -l.

Pour forcer Ash à s'approvisionner en /etc/profile ou tout autre script que vous souhaitez lors de son appel en tant que Shell sans connexion, vous devez configurer une variable d'environnement appelée ENV avant de lancer Ash.

par exemple. dans votre Dockerfile

FROM Alpine:3.5

ENV ENV="/root/.ashrc"

RUN echo "echo 'Hello, world!'" > "$ENV"

Lorsque vous construisez cela, vous obtenez:

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

Enfin, lorsque vous exécutez le conteneur nouvellement généré, vous obtenez:

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

Notez que le shell Ash ne s'est pas exécuté en tant que shell de connexion.

Donc pour répondre à votre question, remplacez

ENV ENV="/root/.ashrc"

avec:

ENV ENV="/etc/profile"

et Ash Shell d'Alpine Linux source automatiquement le script/etc/profile à chaque lancement du shell.

Gotcha: /etc/profile est normalement destiné à ne provenir qu'une seule fois! Donc, je vous conseille de ne pas le source et à la place un source /root/.somercfile.

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

24
Jinesh Choksi

Comme mentionné par Jinesh auparavant, le shell par défaut dans Alpine Linux est ash

localhost:~$ echo $Shell
/bin/ash
localhost:~$ 

Par conséquent, une solution simple consiste également à ajouter vos alias dans .profile. Dans ce cas, je mets tous mes alias dans ~/.ash_aliases

localhost:~$ cat .profile 
# ~/.profile

# Alias
if [ -f ~/.ash_aliases ]; then
    . ~/.ash_aliases
fi

localhost:~$ 

Fichier .ash_aliases

localhost:~$ cat .ash_aliases
alias a=alias
alias c=clear
alias f=file
alias g=grep
alias l='ls -lh'
localhost:~$

Et il fonctionne :)

4
Charlotte Russell