如何让/etc/profile在Alpine / Docker中自动运行



如何让/etc/profile在启动Alpine Docker容器时自动运行?我在aliases.sh文件中添加了一些别名,并将其放置在/etc/profile.d中,但是当我使用docker run -it [my_container] sh启动容器时,我的别名不活跃。我必须每次从命令行手动输入. /etc/profile

是否有一些其他的配置需要得到/etc/profile在登录时运行?我也有使用~/.profile文件的问题。任何见解都是赞赏的!

编辑:

基于VonC的回答,我拉并运行他的示例ruby容器。这是我得到的:

$ 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

虽然/etc/profile.d/rubygems.sh文件存在,但当我登录时它没有运行,并且我的PATH环境变量没有更新。我是否使用了错误的docker run命令?还有什么东西不见了吗?有没有人得到~/.profile/etc/profile.d/文件与Alpine在Docker上工作?谢谢!

Alpine Linux默认的shell是ash

Ash将只读取/etc/profile~/.profile文件,如果它是作为登录shell sh -l启动的。

要强制Ash将/etc/profile或任何其他脚本作为非登录shell调用,您需要在启动Ash之前设置一个名为ENV的环境变量。

编者注: ENV仅在shell是交互式的情况下才被引用。

。在你的Dockerfile

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

当你构建它时,你得到:

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

最后,当你运行新生成的容器时,你会得到:

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

注意,Ash shell不是作为登录shell运行的。

所以要回答你的问题,替换

ENV ENV="/root/.ashrc"

:

ENV ENV="/etc/profile"

和Alpine Linux的Ash shell将在每次启动shell时自动生成/etc/profile脚本。

Gotcha:/etc/profile通常意味着只被引用一次!所以,我建议你不要引用它,而是引用一个/root/。somercfile。

来源:https://stackoverflow.com/a/40538356

你仍然可以尝试在你的Dockerfile a:

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

(假设当前用户是root)。如果没有,将/root替换为完整的主路径)

也就是说,这些/etc/profile.d/xx.sh应该运行。
codeclimate/docker-alpine-ruby为例:

COPY files /

与' files/etc ",包括files/etc/profile.d/rubygems.sh运行良好。


在OP项目Dockerfile中有一个

COPY aliases.sh /etc/profile.d/

但是默认shell是而不是登录shell (sh -l),这意味着profile文件(或/etc/profile.d中的文件)是而不是源的。

添加sh -l也可以:

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

正如Jinesh之前提到的,Alpine Linux中的默认shell是ash

localhost:~$ echo $SHELL
/bin/ash
localhost:~$ 
因此,简单的解决方案是在.profile中添加别名。在本例中,我将所有别名放在~/.ash_aliases 中
localhost:~$ cat .profile 
# ~/.profile
# Alias
if [ -f ~/.ash_aliases ]; then
    . ~/.ash_aliases
fi
localhost:~$ 

。ash_aliases文件

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

它工作了:)

我用这个:

docker exec -it my_container /bin/ash '-l'

传递给ash的-l标志将使其表现为登录shell,因此读取~/.profile

相关内容

  • 没有找到相关文章

最新更新