如何在Dockerfile中设置一个variablesENV以便在Docker容器中重写?

我有一个容器,应该与IP用户创build。

这就是我在Dockerfile中的内容:

ENV REMOTE_HOST=xxxxxxxxxx RUN { \ echo '[xdebug]'; \ echo 'zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so'; \ echo 'xdebug.remote_enable=1'; \ echo 'xdebug.remote_port=9000'; \ echo 'xdebug.remote_autostart=1'; \ echo 'xdebug.remote_handler=dbgp'; \ echo 'xdebug.idekey=dockerdebug'; \ echo 'xdebug.profiler_output_dir="/var/www/html"'; \ echo 'xdebug.remote_connect_back=0'; \ echo 'xdebug.remote_host=$REMOTE_HOST'; \ } >> /usr/local/etc/php/php.ini 

这就是我如何创build从该Dockerfile派生的容器:dockerrun从该Dockerfile的图像:

 docker run -e REMOTE_HOST=123456 -p 80:80 -v /Users/myusrname/Documents/mysite:/var/www/html myImage 

这是我在php.ini里面的容器:

 root@1713e0a338f9:/var/www/html# cat /usr/local/etc/php/php.ini ... [xdebug] zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so xdebug.remote_enable=1 xdebug.remote_port=9000 xdebug.remote_autostart=1 xdebug.remote_handler=dbgp xdebug.idekey=dockerdebug xdebug.profiler_output_dir="/var/www/html" xdebug.remote_connect_back=0 xdebug.remote_host=$REMOTE_HOST 

什么是通过该variables的正确方法?

如果你正在试图传入数据,那么你正在寻找ARG--build-arg ; 这可以在Dockerfile文档中find。

Dockerfile:

 FROM ubuntu ARG REMOTE_HOST RUN echo ${REMOTE_HOST} > /my_file 

然后build立文件:

 ➜ docker build -t test_image --build-arg REMOTE_HOST=1.2.3.4 . Sending build context to Docker daemon 10.24kB Step 1/3 : FROM ubuntu ---> 20c44cd7596f Step 2/3 : ARG REMOTE_HOST ---> Using cache ---> f9815e560847 Step 3/3 : RUN echo ${REMOTE_HOST} > /my_file ---> Running in da07d5d060b7 ---> cdfdbeac71b9 

运行图像并打印出文件:

 ➜ docker run test_image cat /my_file 1.2.3.4 

尽pipe如此,我会留下这个logging。 你可能不希望硬编码一个IP地址到你的图像; 相反,您应该设置您的图像,而不是读取环境variables,并在运行时更新该文件; 在这种情况下,一旦你的Dockerfile被设置来处理 – 你会使用docker run -e REMOTE_HOST=1.2.3.4 。 做到这一点,你会想要的东西,如:

Dockerfile:

 FROM ubuntu COPY php.ini /usr/local/etc/php/php.ini COPY entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh # Or ensure it's +x already ENTRYPOINT [ "entrypoint.sh" ] 

php.ini中

 { echo '[xdebug]'; echo 'zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so'; echo 'xdebug.remote_enable=1'; echo 'xdebug.remote_port=9000'; echo 'xdebug.remote_autostart=1'; echo 'xdebug.remote_handler=dbgp'; echo 'xdebug.idekey=dockerdebug'; echo 'xdebug.profiler_output_dir="/var/www/html"'; echo 'xdebug.remote_connect_back=0'; echo 'xdebug.remote_host=$REMOTE_HOST'; } 

entrypoint.sh

 #!/bin/bash set -e # Check if our environment variable has been passed. if [ -z "${REMOTE_HOST}" ] then echo "REMOTE_HOST has not been set." exit 1 else sed -i.bak "s/\$REMOTE_HOST/${REMOTE_HOST}/g" /usr/local/etc/php/php.ini fi exec "$@" 

build立图像:

 ➜ docker build -t test_image . Sending build context to Docker daemon 4.608kB Step 1/5 : FROM ubuntu ---> 20c44cd7596f Step 2/5 : COPY php.ini /usr/local/etc/php/php.ini ---> 1785c0238ce8 Step 3/5 : COPY entrypoint.sh /usr/local/bin/ ---> c63c289c411e Step 4/5 : RUN chmod +x /usr/local/bin/entrypoint.sh # Or ensure it's +x already ---> Running in 09b07f8724a9 ---> 66ab090f405a Removing intermediate container 09b07f8724a9 Step 5/5 : ENTRYPOINT entrypoint.sh ---> Running in 1f5a7ebec98e ---> 2992128843cd Removing intermediate container 1f5a7ebec98e Successfully built 2992128843cd Successfully tagged test_image:lates 

运行映像并提供REMOTE_HOST

 ➜ docker run -e REMOTE_HOST=1.2.3.4 test_image cat /usr/local/etc/php/php.ini { echo '[xdebug]'; echo 'zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so'; echo 'xdebug.remote_enable=1'; echo 'xdebug.remote_port=9000'; echo 'xdebug.remote_autostart=1'; echo 'xdebug.remote_handler=dbgp'; echo 'xdebug.idekey=dockerdebug'; echo 'xdebug.profiler_output_dir="/var/www/html"'; echo 'xdebug.remote_connect_back=0'; echo 'xdebug.remote_host=1.2.3.4'; } 

如果你跑步

 docker run --build-arg REMOTE_HOST=123456 .... 

然后你的docker文件应该有下面一行来检索环境variables。

 ARG REMOTE_HOST ENV REMOTE_HOST=$REMOTE_HOST 

你应该能够使用PHP回声打印它,如下所示:

  echo 'xdebug.remote_host='.getenv('REMOTE_HOST'); 

但是,如果您只是想将主机传递给容器,那么在运行“docker run”时应该使用–add-host参数。 像下面这样:

 docker run --add-host=remote_host:10.180.0.1 ....