构建Dockerfile时如何使用docker机器的环境变量

How to use the environment variables of docker machine when building a Dockerfile

创建新图像时,我的 Dockerfile 需要调用 npm install。这也需要在代理后面工作。此时以下 Dockerfile 代码有效:

# Set proxy server
ENV http_proxy http://myproxy.example
ENV https_proxy http://myproxy.example

# run NPM install
RUN npm install --production

不过,我希望我可以将 ENV 变量设置为与我用

设置的 docker-机器中相同的变量
 docker-machine create \
 -d virtualbox \
 --engine-env HTTP_PROXY=http://myproxy.example \
 --engine-env HTTPS_PROXY=http://myproxy.example \
 dock

即我希望 npm install 命令使用这些环境变量。这将确保可以在具有可用代理设置的任何环境中构建此 Dockerfile 的图像。

我已经使用命令

将创建的机器设置为env
docker-machine env --no-proxy dock

据我所知,这不可能像您希望的那样。你在docker-machine设置的环境变量是给docker-engine到push/pull图片等的,不能引用

您可以使用 ARG 指令,它像 Dockerfile 中的变量一样处理 (Link)。这使您能够使用 docker build 命令

传递变量

例如,您可以按以下方式使用它:

# define proxy variable
ARG proxy

# set proxy
ENV http_proxy=$proxy
ENV https_proxy=$proxy

# run NPM install
RUN npm install --production

因此,当您构建图像时,您可以使用 docker build -t [ImageName] --build-arg proxy=http://myproxy.example [ProjectDir]

传递代理

http_proxy 和类似的变量 predefined args 不需要在 Dockerfile 中指定:

Docker has a set of predefined ARG variables that you can use without a corresponding ARG instruction in the Dockerfile.

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • FTP_PROXY
  • ftp_proxy
  • NO_PROXY
  • no_proxy

要使用它,您只需将其作为构建参数传递给:

docker build \
  --build-arg http_proxy=http://myproxy.example \
  --build-arg https_proxy=http://myproxy.example \
  .

对于您的 npm install 行,它们可能已经存在于您的环境中,如果没有,您应该可以使用:

RUN http_proxy=$http_proxy https_proxy=$https_proxy npm install --production

请注意,您不应将这些放在图片中 ENV,因为这可能会对您 运行 图片的其他位置产生负面影响。