Docker 破坏了环境变量的全部目的?
Docker defeats the entire purpose of Environment Variables?
所以我对 Docker
很陌生,我只是对它如何处理感到困惑 environment variables
。
我知道如果您在应用程序中使用环境变量,您可以使用 ENV key=value
在 Dockerfile
中定义它们,但是 这不会完全违背环境变量的目的?
推理: 当我们将源代码推送到 github 时,Dockerfile
及其所有内容都是纯文本,我们的环境变量也是如此刚刚暴露。还要说你没有将 Dockerfile
推到 github 但它仍然用于制作 image
可以在 Docker Desktop
中检查它再次揭示了环境变量纯文本。
那么我们在Docker中如何正确处理环境变量呢?
我在我的项目结构中使用了一个 .env 文件。无论如何,我们是否可以将 Docker
配置为仅使用 .env 文件,而不必为我们拥有的每个变量显式键入 ENV key=value
?
谢谢!
您可以使用 --env-file
选项在 docker 运行 命令中传递文件。该文件与 Dockerfile 不同。
--env-file 文档
您可以在 运行 容器时传递环境变量,方法是当场定义它们或从文件加载它们。
例如,如果您打算使用一个文件,
docker run --env-file ./env.list ubuntu bash
This file should use the syntax <variable>=value (which sets the variable to the given value) or (which takes the value from the local environment), and # for comments.
更多使用环境变量的不同做法,请参考Set environment variables (-e, --env, --env-file)。
在 Docker 文件中设置 ENV
没问题;它不会比在 .profile
文件中将 PS1
设置为固定值更“违背环境变量的目的”。
有时环境变量用于控制语言的特性运行时间。一个很好的例子是 PYTHONUNBUFFERED
变量,它导致 Python 运行 时间立即写入 print()
对标准输出的调用。在 Docker 中,您通常希望设置此项以避免 。最终用户通常不想覆盖它。
FROM python:3.9
# We will _always_ want unbuffered mode when running in Docker
ENV PYTHONUNBUFFERED=1
另一个有用的途径是使用环境变量来提供命令行选项。例如,使用 Node yargs 命令行解析库,我们可以将其设置为同时识别 --arguments
和 $ARGUMENTS
:
const argv = require('yargs/yargs')(process.argv.slice(2))
.env('GREETER')
.option('greeting', { default: 'Hello' })
.option('place', { default: 'world' })
.argv;
console.log('%s, %s', argv.greeting, argv.place);
当你运行这个的时候,你可以尝试覆盖命令部分
docker run --rm my/greeter node greeter.js --place 'Stack Overflow'
但是如果您有许多来自不同来源的选项,那么通过环境变量指定选项会更方便。 (这是双重事实,即使没有 Docker,如果某些选项可能只是有时出现;设置环境变量比在 [=44 中包含选项更容易、更安全、更便携=]命令。)
docker run --rm -e GREETER_PLACE='Stack Overflow' my/greeter
这种方法还可以让您为 Docker 文件中的单个选项提供默认值,如果仅仅是 运行ning 在容器中的事实不同足以值得不同的默认值来自代码。
FROM node:14
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY greeter.js .
ENV GREETER_PLACE=Docker
CMD ["node", "greeter.js"]
您说得对,图像中的 ENV
设置不是秘密;它们可以通过 运行ning docker inspect
在图像上检索,或者(通常)通过 docker run --rm the-image env
.
检索
所以我对 Docker
很陌生,我只是对它如何处理感到困惑 environment variables
。
我知道如果您在应用程序中使用环境变量,您可以使用 ENV key=value
在 Dockerfile
中定义它们,但是 这不会完全违背环境变量的目的?
推理: 当我们将源代码推送到 github 时,Dockerfile
及其所有内容都是纯文本,我们的环境变量也是如此刚刚暴露。还要说你没有将 Dockerfile
推到 github 但它仍然用于制作 image
可以在 Docker Desktop
中检查它再次揭示了环境变量纯文本。
那么我们在Docker中如何正确处理环境变量呢?
我在我的项目结构中使用了一个 .env 文件。无论如何,我们是否可以将 Docker
配置为仅使用 .env 文件,而不必为我们拥有的每个变量显式键入 ENV key=value
?
谢谢!
您可以使用 --env-file
选项在 docker 运行 命令中传递文件。该文件与 Dockerfile 不同。
--env-file 文档
您可以在 运行 容器时传递环境变量,方法是当场定义它们或从文件加载它们。
例如,如果您打算使用一个文件,
docker run --env-file ./env.list ubuntu bash
This file should use the syntax <variable>=value (which sets the variable to the given value) or (which takes the value from the local environment), and # for comments.
更多使用环境变量的不同做法,请参考Set environment variables (-e, --env, --env-file)。
在 Docker 文件中设置 ENV
没问题;它不会比在 .profile
文件中将 PS1
设置为固定值更“违背环境变量的目的”。
有时环境变量用于控制语言的特性运行时间。一个很好的例子是 PYTHONUNBUFFERED
变量,它导致 Python 运行 时间立即写入 print()
对标准输出的调用。在 Docker 中,您通常希望设置此项以避免
FROM python:3.9
# We will _always_ want unbuffered mode when running in Docker
ENV PYTHONUNBUFFERED=1
另一个有用的途径是使用环境变量来提供命令行选项。例如,使用 Node yargs 命令行解析库,我们可以将其设置为同时识别 --arguments
和 $ARGUMENTS
:
const argv = require('yargs/yargs')(process.argv.slice(2))
.env('GREETER')
.option('greeting', { default: 'Hello' })
.option('place', { default: 'world' })
.argv;
console.log('%s, %s', argv.greeting, argv.place);
当你运行这个的时候,你可以尝试覆盖命令部分
docker run --rm my/greeter node greeter.js --place 'Stack Overflow'
但是如果您有许多来自不同来源的选项,那么通过环境变量指定选项会更方便。 (这是双重事实,即使没有 Docker,如果某些选项可能只是有时出现;设置环境变量比在 [=44 中包含选项更容易、更安全、更便携=]命令。)
docker run --rm -e GREETER_PLACE='Stack Overflow' my/greeter
这种方法还可以让您为 Docker 文件中的单个选项提供默认值,如果仅仅是 运行ning 在容器中的事实不同足以值得不同的默认值来自代码。
FROM node:14
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY greeter.js .
ENV GREETER_PLACE=Docker
CMD ["node", "greeter.js"]
您说得对,图像中的 ENV
设置不是秘密;它们可以通过 运行ning docker inspect
在图像上检索,或者(通常)通过 docker run --rm the-image env
.