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!
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
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.
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 :)