如何在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 ....