对于 Docker 容器,我们使用 Alpine Linux,例如 Node:Alpine,以使我们的镜像尽可能小。但有时您想登录该容器。将您的别名放在该容器中会很方便。
当我们使用标准 Linux 时,我们将 .bashrc 映射到 /root/.bashrc 并让所有别名可用。
但我找不到 Alpine Linix 的 .bashrc 等效项。
我试过了:
- .bashrc
- .bash_配置文件
- 。轮廓
- .ash_profile
- .ashrc
全部不工作。
附加信息
Alpine Linux 在 Docker 容器中启动。
Dockerfile
FROM node:alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/build .
登录容器
我从主机(我的 OSX macbook)使用以下命令
docker exec -it <containerName> /bin/sh
docker-compose.yml
jobrunner:
build:
context: ./build
dockerfile: Dockerfile
image: jobrunner:1.0
volumes:
- ./deployment/jobs/root/.bashrc:/root/.bashrc
- ./deployment/jobs/root/.bashrc:/root/.profile
- ./logs:/usr/src/app/logs
- ./data:/usr/src/app/data
environment:
NODE_ENV: production
restart: unless-stopped
container_name: JobHelloWorld
command: ["node", "./src/job_starter.js"]
启动容器:
docker-compose up -d
在容器中
当我进入容器时
docker exec -it <containername> /bin/sh
然后是注释中请求的命令的输出:
/usr/src/app # echo $SHELL
/usr/src/app # ps -p $$
ps: unrecognized option: p
BusyBox v1.32.1 () multi-call binary.
Usage: ps [-o COL1,COL2=HEADER] [-T]
Show list of processes
-o COL1,COL2=HEADER Select columns for display
-T Show threads
/usr/src/app #
聚苯乙烯-EF
我想“ps -ef”的输出也很有趣:
/usr/src/app # ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep 360d
8 root 0:00 sh
16 root 0:00 ps -ef
它显示了 sh shell(正确吗?)。但是/bin/sh启动不起作用。
辅助 | grep $$
/usr/src/app # ps aux | grep $$
19 root 0:00 /bin/sh
26 root 0:00 grep 19
/bin/sh 是一个链接
/usr/src/app # ls -la /bin/sh
lrwxrwxrwx 1 root root 12 Apr 14 10:25 /bin/sh -> /bin/busybox
小测试改变.profile
/usr/src/app # cat ~/.profile
alias l='ls $LS_OPTIONS -la'
export foo="bar"
/usr/src/app #
/usr/src/app # echo $foo
/usr/src/app #
/usr/src/app # . ~/.profile
Job-/usr/src/app# echo $foo
bar
Job-/usr/src/app#
如您所见,.profile 确实有效,只是在 Docker 环境中登录 Alpine Linux 时不执行它,或者 Alpine 在登录时不执行 .profile。
有谁知道 Alpine Linux 上交互式会话的启动脚本是什么?
或者:有谁知道为什么 Docker 在从“docker exec”登录时不执行 .profile。
答案1
非常感谢@terdon 的时间和帮助。
当在 Docker 容器中登录 Alpine Linux 时,需要使用以下命令来执行 .profile:
docker exec -it <containerName> /bin/sh -l
请注意末尾的 -l ('l' 表示登录?:-) )。这使得 Alpine shell 启动登录外壳这意味着它读取/etc/profile
和~/.profile
,因此我可以使用这些文件来定义我的别名。
不过 Ubuntu 容器不需要它。
答案2
您可以将环境变量设置$ENV
为要在登录时运行的脚本的路径。这避免了需要-l
作为参数传递给/bin/sh
.
例子:
ENV ENV=/root/.ashrc
这是/root/.ashrc
启动时的来源。
答案3
要登录 Alpine Linux Docker 容器中的用户,使用他们配置的登录 shell, 使用login -f username
。
例如,
docker exec -it mycontainer login -f root
如果用户设置了密码并且您想要使用它,请-f
从命令中删除。
这将导致用户配置的登录 shell 被用作登录 shell,运行作为登录 shell,这意味着它将读取 shell 在作为登录 shell 运行时通常读取的任何 shell 初始化文件(/etc/zsh/zprofile
例如,~/.zprofile
在 的情况下zsh
)。