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

Dockerfile 构建的镜像通过 ssh 登录后,环境变量被重置

  •  
  •   css3 · 2021-05-24 17:20:14 +08:00 · 2147 次点击
    这是一个创建于 1061 天前的主题,其中的信息可能已经有所发展或是发生改变。

    直接通过docker exec进去环境变量是正常的,python,pip啥的都有,但通过ssh登录后,啥都没有, 使用场景又是在ssh登录的前提下使用的

    目前是手动 ssh 登录进去,命令行执行: export $(cat /proc/1/environ |tr '\0' '\n' | xargs)

    有没有一劳永逸的方法,直接在Dockerfile中就搞定环境变量?或者是直接在docker-compose.yml中能处理这个吗

    18 条回复    2021-05-25 13:48:08 +08:00
    chenyi
        1
    chenyi  
       2021-05-24 17:22:00 +08:00
    dockerfile 的 ENV 命令可以搞定
    chenyi
        2
    chenyi  
       2021-05-24 17:23:18 +08:00
    docker-compose 的 environment 也可以做到
    css3
        3
    css3  
    OP
       2021-05-24 17:24:02 +08:00
    @chenyi 我尝试了,无效
    ENV $(cat /proc/1/environ |tr '\0' '\n' | xargs)
    chenyi
        4
    chenyi  
       2021-05-24 17:25:10 +08:00
    @css3 你 ssh 的用户是不是和 docker exec 的用户不是同一个
    css3
        5
    css3  
    OP
       2021-05-24 17:26:38 +08:00
    @chenyi 了解了,那么请教下,Dockerfile 中的 ENV 和 docker-compose.yml 的 environment 如何使用 export $(cat /proc/1/environ |tr '\0' '\n' | xargs),直接写上去没有用,也没报错,好像没生效
    Macolor21
        6
    Macolor21  
       2021-05-24 17:27:06 +08:00
    不知道你说的是不是这个环境变量,只能 run 的时候指定-e 某个变量=xxx 或者-env-file=path-to-file 吧
    compose 也有 Environment 标签
    https://docs.docker.com/compose/environment-variables/
    chenyi
        7
    chenyi  
       2021-05-24 17:27:40 +08:00
    @css3 用 RUN 命令执行?
    css3
        8
    css3  
    OP
       2021-05-24 17:29:56 +08:00
    @chenyi 一样的无效
    css3
        9
    css3  
    OP
       2021-05-24 17:30:45 +08:00
    @Macolor21 就指定一句 export,还要搞个 env 文件吗
    liuguang
        10
    liuguang  
       2021-05-24 17:30:57 +08:00
    MySQL 的,楼主应该知道怎么设置环境变量吧

    ```yaml
    version: '3.1'

    services:
    db_server:
    image: mysql:8.0
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
    MYSQL_ROOT_PASSWORD: "123456"
    TZ: Asia/Shanghai
    volumes:
    - ./app/db_data:/var/lib/mysql:rw
    ```
    css3
        11
    css3  
    OP
       2021-05-24 17:34:55 +08:00
    @liuguang 它不是个 key, value,我不知道 compose 里边怎么转化这个:export $(cat /proc/1/environ |tr '\0' '\n' | xargs)
    CivAx
        12
    CivAx  
       2021-05-24 17:38:44 +08:00
    在 compose yaml 里加一条 command: bash -c "export xxx" 试下呢?
    liuguang
        13
    liuguang  
       2021-05-24 17:38:48 +08:00
    https://docs.docker.com/compose/compose-file/compose-file-v3/#entrypoint

    把 docker 的 entrypoint 换成一个脚本,用脚本先执行你的环境变量设置,再运行程序
    kennylam777
        14
    kennylam777  
       2021-05-24 17:45:33 +08:00   ❤️ 1
    問題不是在 docker, 而是 sshd 下的 shell 沒有引用 container 的 enviroment

    上面一堆教 Dockerfile 等等的都被樓主帶錯了方向

    用 Google 的話秒查到答案了吧
    https://stackoverflow.com/questions/34630571/docker-env-variables-not-set-while-log-via-shell
    Macolor21
        15
    Macolor21  
       2021-05-24 17:50:36 +08:00
    @kennylam777

    回看了一遍问题,刚想说自己忽略了(直接通过 docker exec 进去环境变量是正常的,python,pip 啥的都有,但通过 ssh 登录后,啥都没有, 使用场景又是在 ssh 登录的前提下使用的),既然你给出答案了,我也不赘述了
    css3
        16
    css3  
    OP
       2021-05-24 17:59:36 +08:00
    @CivAx 不行,可以 build 但无法启动容器
    css3
        17
    css3  
    OP
       2021-05-24 18:00:17 +08:00   ❤️ 1
    @kennylam777 多谢老铁,知道了根本原因,通过 statck 这个帖子解决了👍
    julyclyde
        18
    julyclyde  
       2021-05-25 13:48:08 +08:00
    首先你 ssh 进容器就已经很不对了……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   919 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:46 · PVG 04:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.