docker组成交互式容器-运行vs up



我有一个运行python flask rest api的docker应用程序。我希望用户输入(getpass())数据库密码,而不是在任何打开的可读配置文件中。由于我也使用docker网络来解析dns名称,我想使用docker compose up而不是docker compose run。因为run总是创建新的容器,这会干扰我的名称解析。

这是docker组合文件(仅说明了所影响的服务):

version: '3.4'
services:
rest-api:
image: rest_api:latest
container_name: rest_api
tty: true
stdin_open: true
ports:
- 5000:5000
networks:
- mynetwork
networks:
mynetwork:
name: any_network

当使用docker compose up启动服务时,它只是等待而没有得到提示,终端不响应用户的任何输入。docker compose up CLI

使用docker compose run,输入字段正常工作,但名称解析不再工作,因为创建了新的容器名称。docker撰写运行CLI与用户提示符

你有什么建议来解决这个问题?

  • 我是否应该在撰写文件中为我的所有服务定义静态IP地址?
  • 我可以有一个加密的配置文件来存储密码吗?但是我不想要任何硬编码的密码来打开配置。
  • 我知道run命令以某种方式带来了自己的终端设置。我可以有compose up的行为在相同的方式?那么我需要向撰写文件添加哪些设置呢?
  • 我是否应该在停止容器后简单地删除它们,并始终启动compose run--name,以确保容器命名?但是,我需要单独启动所有服务,而不是使用compose up命令一次启动所有服务。我记得run命令还需要端口暴露参数,因为它不是从撰写文件中读取的,对吗?

非常感谢您的建议!

您绝对应该使用docker-compose up来启动容器。run用于"一次性";容器,其配置灵感来自Compose文件。例如,您可以使用它来运行迁移,但不能使用它来运行主服务。

Compose从不以任何有意义的方式与其输入交互;你提出的以交互方式请求密码然后在后台运行的建议不是Compose可以做的。一种有用的方法是将凭据放入环境变量中,如

services:
rest-api:
environment:
- DATABASE_PASSWORD # with no value

,然后在启动容器堆栈时提供该密码

DATABASE_PASSWORD=passw0rd docker-compose up -d

(完全忽略容器私有IP地址。您不需要知道或手动指定它们)

您可以尝试使用官方文档中提到的docker秘密。

如果您不想在docker-compose文件中定义secret,那么您可以事先使用docker secret create命令手动创建它。

示例:echo "DBPASS" | docker secret create db_pass -

最新更新