如何在 Docker 文件中设置变量 ENV 以在 Docker 容器中覆盖?
How to setup an variable ENV inside Dockerfile to be overriden in a Docker container?
我有一个应该用 IP 用户创建的容器。
这是我在 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
这就是我创建从该 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
传递该变量的正确方法是什么?
如果你运行
docker run --build-arg REMOTE_HOST=123456 ....
那么您的 docker 文件应该包含以下行来检索环境变量。
ARG REMOTE_HOST
ENV REMOTE_HOST=$REMOTE_HOST
并且您应该能够使用如下所示的 php 回显来打印它:
echo 'xdebug.remote_host='.getenv('REMOTE_HOST');
但是,如果您只想将主机传递给容器,您应该在 运行ning "docker run" 时使用 --add-host 参数.类似于以下内容:
docker run --add-host=remote_host:10.180.0.1 ....
如果您尝试传递将使用图像构建的数据,那么您正在寻找ARG
和--build-arg
;可以在 Dockerfile documentation.
中找到
Dockerfile:
FROM ubuntu
ARG REMOTE_HOST
RUN echo ${REMOTE_HOST} > /my_file
然后构建文件:
➜ 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
不过我会留个便条;您可能不想将 IP 地址硬编码到您的图像中;相反,您应该设置图像以读取环境变量并在运行时更新该文件;在这种情况下,一旦您的 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 "$@"
构建镜像:
➜ 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';
}
我有一个应该用 IP 用户创建的容器。
这是我在 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
这就是我创建从该 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
传递该变量的正确方法是什么?
如果你运行
docker run --build-arg REMOTE_HOST=123456 ....
那么您的 docker 文件应该包含以下行来检索环境变量。
ARG REMOTE_HOST
ENV REMOTE_HOST=$REMOTE_HOST
并且您应该能够使用如下所示的 php 回显来打印它:
echo 'xdebug.remote_host='.getenv('REMOTE_HOST');
但是,如果您只想将主机传递给容器,您应该在 运行ning "docker run" 时使用 --add-host 参数.类似于以下内容:
docker run --add-host=remote_host:10.180.0.1 ....
如果您尝试传递将使用图像构建的数据,那么您正在寻找ARG
和--build-arg
;可以在 Dockerfile documentation.
Dockerfile:
FROM ubuntu
ARG REMOTE_HOST
RUN echo ${REMOTE_HOST} > /my_file
然后构建文件:
➜ 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
不过我会留个便条;您可能不想将 IP 地址硬编码到您的图像中;相反,您应该设置图像以读取环境变量并在运行时更新该文件;在这种情况下,一旦您的 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 "$@"
构建镜像:
➜ 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';
}