3

我已经使用这个命令运行了我的 Docker 容器: docker run --name test1 -d -e FLAG='***' rastasheep/ubuntu-sshd 现在,当我通过 SSH 连接到它时,我无法通过printenv FLAG. 我怎样才能解决这个问题?使用 and 运行时-itsh我可以通过printenv FLAG.

4

3 回答 3

2

现在,当我通过 SSH 连接到它时,我无法通过 printenv FLAG 获取我的环境。我怎样才能解决这个问题?使用 -it 和 sh 运行时,我可以通过 printenv FLAG 获取 env

你正在做两件不同的事情:

  • docker run -it -e FLAG='***' rastasheep/ubuntu-sshd sh将在与 shell 的交互模式下运行容器,并且此 shell 会话将具有您在命令行上传递的环境变量。使用docker run -d -e FLAG='***' rastasheep/ubuntu-sshd,SSH 守护进程将以定义的环境变量开始。
  • 当您使用 SSH 在容器中连接时,您将创建一个没有设置这些环境变量的新 shell 会话

这可以在运行容器、使用 ssh 连接到它并显示所有进程及其环境变量时观察到:

docker run -d -p 2222:22 -e FLAG='test' rastasheep/ubuntu-sshd
ssh root@localhost -p 2222
...

我们现在连接到容器中,我们可以看到 SSH 守护进程(PID 1)和我们的 SSH 会话进程(PID 7):

root@788fa982c2d0:~# ps -xf
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 /usr/sbin/sshd -D  # <== does have the FLAG env var
    7 ?        Ss     0:00 sshd: root@pts/0   # <== no FLAG env var

让我们检查一下,打印我们当前的进程 env var,以及 SSH 守护进程的 env var:

root@788fa982c2d0:~# printenv FLAG # Nothing
root@788fa982c2d0:~# cat /proc/1/environ # We see the FLAG env var!
[..]FLAG=test[...]

正如@Dmitrii 所指出的,您可以阅读Dockerize an SSH 服务以了解更多详细信息。

于 2019-03-15T13:40:17.740 回答
1

尝试使用以下命令:

docker exec <container-id> bash -c 'echo "$<variable-name>"'
于 2019-03-15T12:41:00.857 回答
0

正如文档所建议的, 您可能需要创建自己的 Dockerfile 并进行以下更改

Project  
|--Dockerfile  
|--entrypoint.sh

Dockerfile

FROM rastasheep/ubuntu-sshd
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["/usr/sbin/sshd", "-D"]

文件:entrypoint.sh

#!/bin/bash
echo "export FLAG=$FLAG" >> /etc/profile
exec "$@"

命令:

 docker build -t your-ubuntu-sshd .
 docker run --name test1 -d -e FLAG='abc' -p 2222:22 your-ubuntu-sshd
于 2019-03-15T14:39:28.200 回答