Alpine Linux 登录时的启动脚本是什么? (我登录时需要我的别名)

Alpine Linux 登录时的启动脚本是什么? (我登录时需要我的别名)

对于 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)。

相关内容