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

时间:2016-06-25 01:39:03

标签: docker sh ash alpine

如何以交互方式启动Alpine Docker容器时自动运行/etc/profile?我已将一些别名添加到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命令吗?还缺少什么?有人在Docker上获得了~/.profile/etc/profile.d/个文件与Alpine合作吗?谢谢!

3 个答案:

答案 0 :(得分:21)

Alpine Linux中的默认shell为 /* INPUT: longDate = "2017-01-27T05:00:00.000Z" * OUTPUT: "1/26/17" * date_format_you_want_in_string from * http://userguide.icu-project.org/formatparse/datetime */ let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" let date = dateFormatter.date(from: longDate) if date != nil { let formatter = DateFormatter() formatter.dateStyle = .short let dateShort = formatter.string(from: date!) return dateShort } else { return longDate } }

只有在ash/etc/profile文件作为登录shell ~/.profile启动时,它才会读取它。

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

e.g。在Dockerfile中

ENV

当你构建时,你得到:

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

请注意,Ash shell没有作为登录shell运行。

因此,要回答您的问题,请替换

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

使用:

ENV ENV="/root/.ashrc"

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

知识: / etc / profile通常只会被提取一次!因此,我建议您不要使用它,而是改为使用/root/.somercfile。

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

答案 1 :(得分:14)

您仍然可以在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 project Dockerfile中,有一个

COPY aliases.sh /etc/profile.d/

但是默认的shell是而不是一个登录shell(sh -l),这意味着profile files (or those in /etc/profile.d) are not sourced

添加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

答案 2 :(得分:4)

如之前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:~$

它有效:)