Dockerfile RUN 命令是否在登录 shell 环境中运行?

iva*_*eev 3 bash docker dockerfile

或者,换句话说,我是否需要运行docker run -it <container> bashdocker run -it <container> bash --login获得与它们运行相同的环境?

Pie*_* B. 6

获得与他们运行时相同的环境?

我理解“因为它们默认运行而不指定命令

这仅取决于您的容器实际配置如何运行:

  • 如果ENTRYPOINTCMD配置为运行登录 shell,则应使用登录 shell
  • 如果ENTRYPOINTCMD配置为运行非登录 shell,则应使用非登录 shell

您可以通过docker inspect在容器上运行来识别这一点,或者docker image inspect它将给您ENTRYPOINTCMD

如果您首先创建run容器,然后使用以下命令创建外壳,则原理相同docker exec -it bash [--login]

例如,使用这个Dockerfile

FROM alpine

RUN apk add bash
RUN echo "export MYVAR=frombashrc" > /root/.bashrc
RUN echo "export MYVAR=fromprofile" > /root/.bash_profile

ENTRYPOINT ["/bin/sh", "-c"]
Run Code Online (Sandbox Code Playgroud)

并运行:

$ docker build . -t mybashimage
$ docker run -it --name bashcontainer mybashimage "bash --login -c 'env && sleep 60'"
HOSTNAME=4aeb776a8c56
MYVAR=fromprofile
...
Run Code Online (Sandbox Code Playgroud)

当容器运行时在另一个 shell 中:

# Running a non-login shell does not have same effect
$ docker exec -it bashcontainer bash
bash-4.4# env
HOSTNAME=5f44398152bf
MYVAR=frombashrc
...

# Running login shell doe
$ docker exec -it bashcontainer bash --login -c 'env'
HOSTNAME=5f44398152bf
MYVAR=fromprofile
...

Run Code Online (Sandbox Code Playgroud)