如何在 Alpine / Docker 中自动将 /etc/profile 变为 运行
How to get /etc/profile to run automatically in Alpine / Docker
如何在交互式启动 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
命令吗?还缺少其他东西吗?有没有人获得 ~/.profile
或 /etc/profile.d/
文件以在 Docker 上使用 Alpine?谢谢!
您仍然可以在您的 Dockerfile 中尝试 a:
RUN echo '\
. /etc/profile ; \
' >> /root/.profile
(假设当前用户是root
。如果不是,将/root
替换为完整的home路径)
也就是说,那些 /etc/profile.d/xx.sh 应该 运行.
以 codeclimate/docker-alpine-ruby
为例:
COPY files /
用'files/etc
" including an files/etc/profile.d/rubygems.sh
运行ning就好了。
在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
Alpine Linux 中的默认 shell 是 ash
。
如果作为登录启动,Ash 将只读取 /etc/profile
和 ~/.profile
文件 shell sh -l
.
要强制 Ash 在作为非登录 shell 调用时获取 /etc/profile
或您想要的任何其他脚本,您需要在启动前设置一个名为 ENV
的环境变量灰.
例如在你的 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 脚本。
陷阱: /etc/profile 通常意味着只能获取一次!因此,我建议您不要获取它,而是获取 /root/.somercfile。
来源:
之前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
如何在交互式启动 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
命令吗?还缺少其他东西吗?有没有人获得 ~/.profile
或 /etc/profile.d/
文件以在 Docker 上使用 Alpine?谢谢!
您仍然可以在您的 Dockerfile 中尝试 a:
RUN echo '\
. /etc/profile ; \
' >> /root/.profile
(假设当前用户是root
。如果不是,将/root
替换为完整的home路径)
也就是说,那些 /etc/profile.d/xx.sh 应该 运行.
以 codeclimate/docker-alpine-ruby
为例:
COPY files /
用'files/etc
" including an files/etc/profile.d/rubygems.sh
运行ning就好了。
在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
Alpine Linux 中的默认 shell 是 ash
。
如果作为登录启动,Ash 将只读取 /etc/profile
和 ~/.profile
文件 shell sh -l
.
要强制 Ash 在作为非登录 shell 调用时获取 /etc/profile
或您想要的任何其他脚本,您需要在启动前设置一个名为 ENV
的环境变量灰.
例如在你的 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 脚本。
陷阱: /etc/profile 通常意味着只能获取一次!因此,我建议您不要获取它,而是获取 /root/.somercfile。
来源:
之前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