V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX  ›  程序员

Docker 如何配置环境变量,使得 SSH 后可以使用?

  •  
  •   dunhanson · 2018-07-14 15:21:08 +08:00 · 7460 次点击
    这是一个创建于 2106 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题所述,百度 google 好久,都没有找到解决办法,网上说写入 /etc/profile,但是无效
    28 条回复    2019-04-10 18:40:44 +08:00
    dunhanson
        1
    dunhanson  
    OP
       2018-07-14 15:22:47 +08:00
    可能有人说,不推荐容器中使用 SSH,但是现阶段水平有限,SSH 还有有必要的
    gouchaoer2
        2
    gouchaoer2  
       2018-07-14 15:25:20 +08:00 via Android   ❤️ 1
    安装 ssh server,因为默认镜像大都没有。。其实用 ssh 不如 docker exec 进去
    dunhanson
        3
    dunhanson  
    OP
       2018-07-14 15:30:06 +08:00
    @gouchaoer2 我擦,点错了,点了个感谢。我安装了 ssh,现在想直接 ssh 进去,然后环境变量生效
    402645707
        4
    402645707  
       2018-07-14 15:32:20 +08:00
    第一步:安装 docker
    第二步:配置 docker 容器
    第三步:ssh 连上去
    https://blog.csdn.net/qq626387/article/details/50506636
    dunhanson
        5
    dunhanson  
    OP
       2018-07-14 15:38:37 +08:00
    @402645707 我现在可以 ssh,就是环境变量无效
    402645707
        6
    402645707  
       2018-07-14 15:47:21 +08:00
    @dunhanson 如果你没有引入自带 ssh 环境变量容器,你需要自己写个脚本读 docker 传的环境变量来改 /etc/ssh/sshd_config
    cz5424
        7
    cz5424  
       2018-07-14 15:49:19 +08:00 via Android
    docker exec -it 容器名 bash
    cz5424
        8
    cz5424  
       2018-07-14 15:51:15 +08:00 via Android
    不知道楼主设置环境变量的目的是什么,Dockfile 写 ENV 命令就可以设置容器的环境变量,不用 ssh 进去容器命令如上
    cz5424
        9
    cz5424  
       2018-07-14 15:51:44 +08:00 via Android
    手误少打了 er
    qsnow6
        10
    qsnow6  
       2018-07-14 15:54:02 +08:00
    没理解,转发下端口不就能连了吗
    dunhanson
        11
    dunhanson  
    OP
       2018-07-14 15:58:54 +08:00
    @402645707 看上去好麻烦的样子
    dunhanson
        12
    dunhanson  
    OP
       2018-07-14 16:02:21 +08:00
    @cz5424 我相当于把容器当虚拟机来用了,用来部署测试项目,经常需要重启 tomcat。
    现在时我每次时 ssh 到容器,上传修改的文件到容器,
    然后切换标签进入宿主机,再 docker exec -it xxx bash 进入到容器,重启 tomcat
    这样不会很麻烦?
    dunhanson
        13
    dunhanson  
    OP
       2018-07-14 16:03:34 +08:00
    @qsnow6 没说不能连,是连接了环境变量无效的问题,只有通过 docker exec -it xxx bash 进入,环境变量才正常
    lrh3321
        14
    lrh3321  
       2018-07-14 16:45:41 +08:00
    Dockerfile 里用 ENV 指令定义环境变量,docker run 的时候 -e 设置也不行吗?
    jptx
        15
    jptx  
       2018-07-14 16:57:17 +08:00   ❤️ 1
    可以修改容器里的~/.bashrc 文件,把你的那些 export 语句都加进去,我的一个容器和你是很相似的用途,就是当成虚拟机用来测试项目,我修改的就是这个文件,把什么 JAVA_HOME 什么的都在这里面写 export,还在里面写了一些 alias 用来方便跳转,方便重启服务
    XSG
        16
    XSG  
       2018-07-14 17:50:57 +08:00   ❤️ 1
    1、配置环境变量,可以 docker run -e TZ="Asia/Shanghai" 这样指定;也可以自己重新制作镜像,在 Dockerfile 中指定好环境变量
    2、传文件到容器里面,你的思路完全错了,用不着 ssh ;你可以在宿主机上用 -v 参数映射一个路径到容器,然后文件直接放到宿主机的这个路径就满足你的要求了
    3、然后是重启 tomcat,最简单的方法是 docker restart $container_name 这样;
    ETiV
        17
    ETiV  
       2018-07-14 18:07:40 +08:00 via iPhone
    Lz 的 docker 可能用错了?

    你 ssh 的环境变量,无法影响到 docker entrypoint 的环境变量……

    建议了解一下 docker-compose,很方便的
    dunhanson
        18
    dunhanson  
    OP
       2018-07-14 21:42:56 +08:00
    @lrh3321 尝试过了,不行
    dunhanson
        19
    dunhanson  
    OP
       2018-07-14 21:43:26 +08:00
    @jptx 好的,我回头试试 谢谢了
    dunhanson
        20
    dunhanson  
    OP
       2018-07-14 21:44:33 +08:00
    @XSG 对哟,好的 我试试
    dunhanson
        21
    dunhanson  
    OP
       2018-07-14 21:45:00 +08:00
    @ETiV 嗯 好的
    singer
        22
    singer  
       2018-07-14 21:48:16 +08:00 via iPhone   ❤️ 1
    楼主可能思维错了。
    传东西,你可以把目录挂到宿主机,在宿主机里改,容器内就会更改
    如果你要进入容器,远程服务器的话,你 ssh 进宿主机,然后 docker exec -it 容器名 bash(如果你的容器没有 bash,就用 sh)

    查看容器名的方法是 docker ps,最后一个参数就是容器名

    多个服务需要同时起,建议使用 docker-compose
    singer
        23
    singer  
       2018-07-14 21:55:47 +08:00 via iPhone
    上面我没回答到点子上,环境变量在你 dockerfile 阶段最好都定义好。
    有些程序在构建镜像的时候,就会把环境变量放进去,所以后面改环境变量也没有任何作用

    还有的是在容器启动得时候,加载环境变量的,这个时候,修改环境变量的。

    还有一种情况就是,构建的时候,读取环境变量,写入到文件,写死。然后在 enterpoint 文件里写的脚本,在容器启动的时候,读取环境变量,然后再一次覆盖文件。这样,环境变量也会生效。

    至于你的环境变量配置后,用不了,我想应该是这个变量在构建的时候,用到了,然后写入了文件。然后在容器启动得时候,没有重新读取覆盖的问题。
    dunhanson
        24
    dunhanson  
    OP
       2018-07-14 22:12:05 +08:00
    @jptx 按照你的方法试了下,确实可行
    dunhanson
        25
    dunhanson  
    OP
       2018-07-14 22:15:27 +08:00
    @singer 嗯 我试试
    Reficul
        26
    Reficul  
       2018-07-15 10:57:08 +08:00 via Android
    容器即进程,重启 tomcat 和重启容器是一样的😬
    xuexb
        27
    xuexb  
       2019-01-06 22:29:45 +08:00
    我也遇到这个问题了,场景是需要 SSH 登录到容器里去部署代码、启动服务,而我配置了个环境变量用来区分当前是哪个环境 ENV_LABEL,发现也没生效,然后使用了在 Dockerfile 入口文件里去向 ~/.bashrc 里写入 export 变量,如: https://github.com/xuexb/DevOps/blob/8f902cb8c4d6c682b2085a657965e625ef958091/jenkins-node/node/env.sh
    NoBeeBee
        28
    NoBeeBee  
       2019-04-10 18:40:44 +08:00
    在布置好 ssh 服务之前,需要启动容器之前,即 docker run 的时候把容器内部的 ssh 服务的 22 端口映射到寄主机上面你指定的端口,例如 2022,参数如下:
    -p 2022:22
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2590 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:41 · PVG 09:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.