我无法在Docker容器中获取env var

时间:2019-03-15 12:02:48

标签: linux docker containers lxc lxc-docker

我已经使用以下命令运行了Docker容器: docker run --name test1 -d -e FLAG='***' rastasheep/ubuntu-sshd 现在,当我通过SSH连接到它时,无法通过printenv FLAG将我的环境保存在那里。 我怎样才能解决这个问题?当与-itsh一起运行时,我可以通过printenv FLAG获取环境。

3 个答案:

答案 0 :(得分:1)

尝试使用以下命令:

docker exec <container-id> bash -c 'echo "$<variable-name>"'

答案 1 :(得分:1)

  

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

您正在做两种不同的事情:

  • docker run -it -e FLAG='***' rastasheep/ubuntu-sshd sh将以交互模式运行一个带有Shell的容器,并且此Shell会话将具有您在命令行中传递的环境变量。使用docker run -d -e FLAG='***' rastasheep/ubuntu-sshd,SSH守护进程将从定义的env vars开始。
  • 当您使用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 service以获得更多详细信息。

答案 2 :(得分:0)

根据docs的建议 您可能需要通过以下更改来创建自己的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