pwjcw 2023-11-24 09:34 采纳率: 66.7%
浏览 7
已结题

Docker 执行run操作其中的-e参数没有被正常写入环境变量,如何解决?(相关搜索:初始化)

Docker 执行run操作其中的-e参数没有被正常写入环境变量

创建Docker 容器


```bash
root@lszVKWYaD7:/home/tmp/s3-6/s3-6# docker run -itd  -p 2001:22 -e passwd=123456 test
0a4c5cdd74f3392afa28f3b8a5c728d5006861533e8ac74efca7482feb36c1fc
root@lszVKWYaD7:/home/tmp/s3-6/s3-6# docker ps
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS        PORTS                                           NAMES
0a4c5cdd74f3   test      "supervisord -n"   2 seconds ago   Up 1 second   80/tcp, 0.0.0.0:2001->22/tcp, :::2001->22/tcp   confident_austin
查看创建的容器是否被写入到环境变量

```bash
root@lszVKWYaD7:/home/tmp/s3-6/s3-6# docker exec 0a env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0a4c5cdd74f3
passwd=123456
HOME=/root

通过上面的内容可以看到passwd的内容确实是123456,但是该镜像中的Dockerfile中,会将passwd变量赋值给ssh密码,为什么密码仍然是Dockerfile中初始化的666666,而不是Docker run中的123456
Dockerfile内容如下


```bash

FROM ubuntu:14.04

ENV passwd=666666
COPY html/ /var/www/html/

RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.tuna.tsinghua.edu.cn\/ubuntu\//g' /etc/apt/sources.list && \
    sed -i '/security/d' /etc/apt/sources.list && \
    apt-get update -y && \
    apt-get -yqq install supervisor mariadb-server apache2 php5 libapache2-mod-php5 \
    php5-mysql php5-mcrypt ssh && \
        apt-get install php5-gd -y && \
    service apache2 restart && \
    # config
    sed -i "154s/Indexes//" /etc/apache2/apache2.conf && \
    sed -i "165s/Indexes//" /etc/apache2/apache2.conf && \
    /etc/init.d/apache2 start && \
 
    # supervisor
RUN mkdir -p /var/log/supervisor && \
    mv /var/www/html/supervisord.conf /etc/ && \
    #
    chown -R www-data:www-data /var/www/html/ && \
    chmod -R 755 /var/www/html/ && \
    rm /var/www/html/db.sql /var/www/html/index.html && \
    cat /dev/null > /var/www/html/log.php

RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN useradd -g www-data ctf -m && \
    password=$(openssl passwd -1 -salt 'abcdefg' $passwd) && \
    sed -i 's/^ctf:!/ctf:'$password'/g' /etc/shadow

RUN chmod -R 777 /var/www/html

RUN mkdir /var/run/sshd

RUN echo 'flag{test_flag}' > /flag.txt

EXPOSE 80
EXPOSE 22

ENTRYPOINT ["supervisord", "-n"]

```

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-24 12:24
    关注

    【以下回答由 GPT 生成】

    你在Docker run命令中使用了-e参数来设置环境变量,但是该环境变量并没有被正确地写入Docker容器中。根据你提供的信息,我们可以看到在Docker exec命令中,passwd变量确实被成功写入了环境变量中。但是在Docker容器启动时,SSH密码仍然是Dockerfile中初始化的666666,而不是Docker run中设置的123456。这是因为Docker在启动容器时会将Dockerfile中的环境变量覆盖掉用户在Docker run命令中设置的环境变量。

    要解决这个问题,有几种方法可以尝试:

    1. 在Dockerfile中使用ENTRYPOINT或CMD命令来执行启动容器时的命令,而不是在Dockerfile中直接运行supervisord。这样可以保留用户在Docker run命令中设置的环境变量。

    ```bash FROM ubuntu:14.04

    ENV passwd=666666 COPY html/ /var/www/html/

    RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.tuna.tsinghua.edu.cn\/ubuntu\//g' /etc/apt/sources.list && \ sed -i '/security/d' /etc/apt/sources.list && \ apt-get update -y && \ apt-get -yqq install supervisor mariadb-server apache2 php5 libapache2-mod-php5 \ php5-mysql php5-mcrypt ssh && \ apt-get install php5-gd -y && \ service apache2 restart && \ sed -i "154s/Indexes//" /etc/apache2/apache2.conf && \ sed -i "165s/Indexes//" /etc/apache2/apache2.conf && \ /etc/init.d/apache2 start && \ mkdir -p /var/log/supervisor && \ mv /var/www/html/supervisord.conf /etc/ && \ chown -R www-data:www-data /var/

    # 使用ENTRYPOINT或CMD来启动容器 ENTRYPOINT ["/usr/bin/supervisord", "-n"] ```

    这样,在启动容器时,Docker会将用户在Docker run命令中设置的环境变量传递给ENTRYPOINT或CMD命令。

    1. 在Dockerfile中使用ARG命令定义一个构建参数,然后在Docker run命令中使用--build-arg参数来传递该参数,从而覆盖Dockerfile中的环境变量。

    ```bash FROM ubuntu:14.04

    ARG passwd=666666 ENV passwd=${passwd} COPY html/ /var/www/html/

    RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.tuna.tsinghua.edu.cn\/ubuntu\//g' /etc/apt/sources.list && \ sed -i '/security/d' /etc/apt/sources.list && \ apt-get update -y && \ apt-get -yqq install supervisor mariadb-server apache2 php5 libapache2-mod-php5 \ php5-mysql php5-mcrypt ssh && \ apt-get install php5-gd -y && \ service apache2 restart && \ sed -i "154s/Indexes//" /etc/apache2/apache2.conf && \ sed -i "165s/Indexes//" /etc/apache2/apache2.conf && \ /etc/init.d/apache2 start && \ mkdir -p /var/log/supervisor && \ mv /var/www/html/supervisord.conf /etc/ && \ chown -R www-data:www-data /var/ ```

    然后在Docker run命令中传递--build-arg参数来覆盖环境变量的值:

    bash docker run -itd -p 2001:22 --build-arg passwd=123456 test

    这样可以确保启动的容器中的环境变量与Docker run命令中设置的值一致。

    以上是两种解决办法,请根据你的实际需求选择其中一个尝试。如果你有任何进一步的问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月28日
  • 创建了问题 11月24日

悬赏问题

  • ¥15 关于stm32hal库驱动ft6336触摸屏遇到的问题
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22