Ber*_*rtC 6 startup bash docker alpine-linux
对于 Docker 容器,我们使用 Alpine Linux,例如 Node:Alpine,以使我们的镜像尽可能小。但有时您想登录该容器。将您的别名放在该容器中会很方便。
当我们使用标准 Linux 时,我们将 .bashrc 映射到 /root/.bashrc 并让所有别名可用。
但我找不到 Alpine Linix 的 .bashrc 等效项。
我试过了:
全部不工作。
Alpine Linux 在 Docker 容器中启动。
FROM node:alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/build .
Run Code Online (Sandbox Code Playgroud)
我从主机(我的 OSX macbook)使用以下命令
FROM node:alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/build .
Run Code Online (Sandbox Code Playgroud)
docker exec -it <containerName> /bin/sh
Run Code Online (Sandbox Code Playgroud)
启动容器:
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"]
Run Code Online (Sandbox Code Playgroud)
当我进入容器时
docker-compose up -d
Run Code Online (Sandbox Code Playgroud)
然后是注释中请求的命令的输出:
docker exec -it <containername> /bin/sh
Run Code Online (Sandbox Code Playgroud)
我想“ps -ef”的输出也很有趣:
/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 #
Run Code Online (Sandbox Code Playgroud)
它显示了 sh shell(正确吗?)。但是/bin/sh启动不起作用。
/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
Run Code Online (Sandbox Code Playgroud)
/usr/src/app # ps aux | grep $$
19 root 0:00 /bin/sh
26 root 0:00 grep 19
Run Code Online (Sandbox Code Playgroud)
/usr/src/app # ls -la /bin/sh
lrwxrwxrwx 1 root root 12 Apr 14 10:25 /bin/sh -> /bin/busybox
Run Code Online (Sandbox Code Playgroud)
如您所见,.profile 确实有效,只是在 Docker 环境中登录 Alpine Linux 时不执行它,或者 Alpine 在登录时不执行 .profile。
非常感谢@terdon 的时间和帮助。
当在 Docker 容器中登录 Alpine Linux 时,需要使用以下命令来执行 .profile:
docker exec -it <containerName> /bin/sh -l
Run Code Online (Sandbox Code Playgroud)
请注意末尾的 -l ('l' 表示登录?:-) )。这使得 Alpine shell 启动一个登录 shell,这意味着它读取/etc/profile和~/.profile,因此我可以使用这些文件来定义我的别名。
不过 Ubuntu 容器不需要它。