天道酬勤,学无止境

替换 Docker 映像中的数据库连接字符串(Replacing database connection strings in the Docker image)

问题

我在应用程序的发布过程中遇到了困难。 该应用程序正在 .NET Core 中开发,并使用“appsettings.json”来保存与数据库的连接字符串。 该应用程序应部署到 Azure 中的 Kubernetes 集群。 我们在 Azure DevOps 中有一个构建和发布过程,因此该过程是自动化的,尽管问题属于将其部署到多个环境 (DEV/QA/UAT) 的必要性,并且每个环境都使用自己的数据库。 当我们构建 Docker 镜像时,保存连接字符串的“appsettings.json”被嵌入到镜像中。 下一步将映像推送到容器存储库,然后发布过程使用该容器存储库将映像部署到集群(这些步骤是经典的)。

在构建步骤中将连接参数替换或放入变量中并不是什么大问题。 但是,这是一个控制部署到多个环境的发布过程。 我看不到如何将连接字符串替换为发布管道中的数据库......或者更好地说,如何部署到三个不同的环境,并为每个环境正确设置数据库连接字符串。

请建议如何实现。 我想出的唯一选择是为每个看起来不漂亮的环境提供三个独立的构建管道。 Release 背后的整个想法是,您可以在将更改推广到下一个环境之前管理审批流程。

回答1

决定继续使用 Kubernetes 机密。 在这里找到一篇关于这个问题的好文章:https://strive2code.net/post/2018/12/07/devops-friday-build-a-deployment-pipeline-using-k8s-secrets

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • flyway 无法连接到 docker-entrypoint-initdb.d 脚本中的 postgres 容器(flyway unable to connect to postgres container within docker-entrypoint-initdb.d script)
    问题 我正在尝试将 postgres Docker 映像扩展为可能(通过环境变量标志)在 DB init 上执行 flyway DB 迁移。 我的 Dockerfile 在这里: FROM postgres:9.6 # Install curl and java (for Flyway) RUN set -x \ && apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl openjdk-8-jre # Install Flyway ENV FLYWAY_VERSION 4.2.0 ENV FLYWAY_INSTALL_DIR /usr/src/flyway ENV FLYWAY_CONF ${FLYWAY_INSTALL_DIR}/flyway-${FLYWAY_VERSION}/conf/flyway.conf ENV FLYWAY_EXE ${FLYWAY_INSTALL_DIR}/flyway-${FLYWAY_VERSION}/flyway RUN mkdir -p ${FLYWAY_INSTALL_DIR} && \ curl -L https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/
  • 从外部连接到Docker容器中的Postgresql(Connecting to Postgresql in a docker container from outside)
    问题 我在docker容器中的服务器上安装了Postgresql。 如何从外部(即从本地计算机)连接到它? 我应采用什么设置来允许它? 回答1 您可以通过以下方式运行Postgres(映射端口): docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres 因此,现在您已将容器的端口5432映射到服务器的端口5432。 -p <host_port>:<container_port> 。因此现在您可以从public-server-ip:5432访问postgres了。 要测试:运行postgres数据库(上面的命令) docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05b3a3471f6f postgres "/docker-entrypoint.s" 1 seconds ago Up 1 seconds 0.0.0.0:5432->5432/tcp some-postgres 进入您的容器并创建一个数据库: docker exec -it 05b3a3471f6f bash root@05b3a3471f6f:/# psql -U postgres postgres-#
  • 如何将mysql工作台连接到docker中运行的mysql?(How to connect mysql workbench to running mysql inside docker?)
    问题 我正在docker容器内使用mysql服务器,并能够在docker内部访问。 如何在本地(主机)上运行的mysql工作台中创建连接。 回答1 默认情况下,部署后,MySQL具有以下连接限制: mysql> select host, user from mysql.user; +-----------+---------------+ | host | user | +-----------+---------------+ | localhost | healthchecker | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +-----------+---------------+ 4 rows in set (0.00 sec) 显然,出于安全目的,您将无法在Docker映像之外连接到该映像。 如果您需要更改它以允许root从任何主机连接(例如,出于开发目的),请执行以下操作: 使用所需的所有端口映射启动mysql映像: docker run -p 3306:3306 --name=mysql57 -d mysql/mysql-server:5.7 或者,如果需要完整的端口映射: docker run -p 3306:3306 -p 33060:33060 -
  • Linux Docker 中的 SQL Server 实例字符串连接(SQL Server instance string connection in Linux Docker)
    问题 我正在向 docker 映像microsoft/dotnet:1.0.1-core发布一个应用程序,该应用程序在连接字符串中引用了 Sql Server 实例: "Data Source=host\instance;Initial Catalog=database;User ID=user;Password=pass;" 在 Windows 环境中它也可以工作,但是使用 docker,应用程序无法连接到数据库。 更改Data Source以使用port而不是instance 。 "Data Source=host,port;Initial Catalog=database;User ID=user;Password=pass;" 如何使用实例而不是端口从 docker 连接到 Sql Server? 回答1 根据微软的 Saurabh Singh 的说法: 实例名称支持在 .Net Core 的 v 1.1 中可用。 在 .Net Core v1.0 中,Windows 以外的操作系统不支持实例名称。 因此,我认为您无法使用实例名称从 Linux 上运行的 .Net Core 1.0 连接到 SQL Server。 您的选择似乎是: 不要使用实例名称等待 .Net Core 1.1(计划于“2016 年秋季”) 使用 .Net Core 1.1 的预发布版本
  • 无法从 Golang 容器连接到 Postgres docker 容器(Can't connect to Postgres docker container from Golang container)
    问题 我有一个使用 golang 构建的网络服务器。 当我在本地测试它时,它工作成功。 但是,当我为 Web 服务器构建 docker 映像时,它无法连接到正在运行的 Postgres 容器。 这是我docker-compose.yml : version: '2' services: go: image: golang:1.7 volumes: - ./:/server/http ports: - "80:8080" links: - postgres - mongodb - redis environment: DEBUG: 'true' PORT: '8080' postgres: image: onjin/alpine-postgres:9.5 restart: unless-stopped ports: - "5432:5432" environment: LC_ALL: C.UTF-8 POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb mongodb: image: mvertes/alpine-mongo:3.2.3 restart: unless-stopped ports: - "27017:27017" redis: image: sickp/alpine-redis:3.2.2
  • 如何自定义官方PostgreSQL Docker映像的配置文件?(How to customize the configuration file of the official PostgreSQL Docker image?)
    问题 我正在使用官方的Postgres Docker映像尝试自定义其配置。 为此,我使用命令sed来更改max_connections例如: sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf 我尝试了两种方法来应用此配置。 第一种是通过将命令添加到脚本并将其复制到init文件夹“ /docker-entrypoint-initdb.d”中。 第二种方法是通过使用“ RUN”命令直接在我的Dockerfile中运行它们(此方法在非官方的Postgresql映像(具有与配置文件“ / etc / postgres / ...”不同的路径)下正常工作)。 在这两种情况下,更改均会失败,因为缺少配置文件(我认为尚未创建)。 我应该如何更改配置? 编辑1: 这是用于创建映像的Dockerfile: # Database (http://www.cs3c.ma/) FROM postgres:9.4 MAINTAINER Sabbane <contact@cs3c.ma> ENV TERM=xterm RUN apt-get update RUN apt-get install -y nano ADD scripts /scripts #
  • 连接到docker-compose mysql容器会拒绝访问,但运行相同映像的docker不会(connecting to a docker-compose mysql container denies access but docker running same image does not)
    问题 我在连接到使用docker-compose启动的mysql docker容器时遇到一些问题。 这是一篇很长的帖子(对不起!)。 这是我的docker-compose.yml文件: db: image: mysql:5.7 ports: - "3306:3306" # I have tried both ports and expose "3306". Still doesn't work environment: - MYSQL_ROOT_PASSWORD="secret" - MYSQL_USER="django" - MYSQL_PASSWORD="secret" - MYSQL_DATABASE="myAppDB" 然后: $> docker-compose build db uses an image, skipping #expected! $> docker-compose up <<LOTS OF OUTPUT>> OK,所以现在我有一个正在运行的Docker容器运行器mysql:5.7。 伟大的! 还是吗? 在django应用中进行测试时,出现操作错误,提示不允许用户连接数据库。 好吧,那也许就是我的django吗? $> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 我怎么知道我的docker mysql容器何时启动并且mysql准备好进行查询?(How do I know when my docker mysql container is up and mysql is ready for taking queries?)
    问题 我正在部署几个不同的Docker容器,第一个是mysql。 我想在数据库启动后立即运行脚本,然后继续构建其他容器。 该脚本已失败,因为它试图在设置mysql(通过此正式mysql容器)的入口点脚本仍在运行时运行。 sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=MY_ROOT_PASS -p 3306:3306 -d mysql [..] wait for mysql to be ready [..] mysql -h 127.0.0.1 -P 3306 -u root --password=MY_ROOT_PASS < MY_SQL_SCRIPT.sql 有没有一种方法可以等待docker容器内的进入MySQL设置脚本完成的信号? 重击睡眠似乎是次佳的解决方案。 编辑:像这样的bash脚本。 不是最优雅,最蛮力的,但就像一种魅力。 也许有人会觉得有用。 OUTPUT="Can't connect" while [[ $OUTPUT == *"Can't connect"* ]] do OUTPUT=$(mysql -h $APP_IP -P :$APP_PORT -u yyy --password=xxx < ./my_script.sql 2>&1) done 回答1 您可以安装mysql
  • docker postgres pgadmin本地连接(docker postgres pgadmin local connection)
    问题 我用nginx,php和postgres创建了一个ubuntu图像。 我想将当前映像中的postgres数据库与位于本地计算机上的pgadmin连接。 我尝试使用docker inspector尝试使用图像ip与我的本地pgadmin建立连接,但没有成功。 我也尝试在本地配置一些端口以使连接正常工作。 回答1 这是一个有效的问题,不知道为什么人们会觉得“似乎无法回答这个问题”。 所以,这就是我要做的事情: 从Docker Hub提取Postgres映像docker pull postgres:latest 使用以下命令运行容器docker run -p 5432:5432 postgres 使用docker's inspect命令查找IP 使用该IP,PORT,用户名和密码在PGADMIN中进行连接您还可以像下面这样简单地进行telnet来确认是否可以访问docker postgres容器: telnet IP_ADDRESS 5432 回答2 我在Windows 10上为Windows 1.12.6(9655)运行docker的Windows 10上成功完成的步骤如下: 拉最新的postgres docker pull postgres:latest 运行postgres容器: docker run -d -e POSTGRES_USER=user -e POSTGRES
  • 设置MySQL并在Dockerfile中导入转储(Setting up MySQL and importing dump within Dockerfile)
    问题 我正在尝试为我的LAMP项目设置一个Dockerfile,但是在启动MySQL时遇到了一些问题。 我在Dockerfile上有以下几行: VOLUME ["/etc/mysql", "/var/lib/mysql"] ADD dump.sql /tmp/dump.sql RUN /usr/bin/mysqld_safe & sleep 5s RUN mysql -u root -e "CREATE DATABASE mydb" RUN mysql -u root mydb < /tmp/dump.sql 但我不断收到此错误: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) 关于如何在Dockerfile构建期间设置数据库创建和转储导入的任何想法? 回答1 Dockerfile每个RUN指令都在不同的层中执行(如RUN文档中所述)。 在Dockerfile ,您具有三个RUN指令。 问题是MySQL服务器仅在第一个启动。 在其他版本中,没有MySQL正在运行,这就是为什么出现与mysql客户端的连接错误的原因。 要解决此问题,您有2个解决方案。 解决方案1:使用单行RUN RUN /bin/bash -c "
  • Docker等待PostgreSQL运行(Docker wait for postgresql to be running)
    问题 我在我的项目中将Django与PostgreSQL一起使用。 我将它们放在不同的容器中,问题是我需要在运行django之前等待postgres。 这时候我正在用django容器的command.sh文件中的sleep 5来做它。 我还发现netcat可以解决问题,但我更希望不使用其他软件包。 curl和wget无法执行此操作,因为它们不支持postgres协议。 有办法吗? 回答1 这将成功等待Postgres启动。 (特别是第6行)。 只要将Postgres启动后要执行的命令替换为npm start即可。 services: practice_docker: image: dockerhubusername/practice_docker ports: - 80:3000 command: bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; npm start' depends_on: - db environment: - DATABASE_URL=postgres://postgres:password@db:5432/practicedocker - PORT=3000 db: image: postgres environment: - POSTGRES_USER=postgres - POSTGRES
  • 如何通过Docker在MongoDB上启用身份验证?(How to enable authentication on MongoDB through Docker?)
    问题 我想为mongodb:latest启动一个docker,但仅允许某些用户访问某些db(即enable --auth )。 任何人都不能访问mongodb! 作为docker启动的一部分,我应该如何做? 顺便说一句,通过在启动过程中使用以下命令, data directory位于主机上: -v /my/own/datadir:/data/db 。 回答1 如果您看一下: https://github.com/docker-library/mongo/blob/master/4.2/Dockerfile https://github.com/docker-library/mongo/blob/master/4.2/docker-entrypoint.sh#L303-L313 您会注意到docker-entrypoint.sh使用了两个变量: MONGO_INITDB_ROOT_USERNAME MONGO_INITDB_ROOT_PASSWORD 您可以使用它们来设置root用户。 例如,您可以使用以下docker-compose.yml文件: mongo-container: image: mongo:3.4.2 environment: # provide your credentials here - MONGO_INITDB_ROOT_USERNAME=root -
  • Spring/RabbitMQ 教程的 Docker 映像导致连接被拒绝(Docker image for Spring/RabbitMQ tutorial results in connection refused)
    问题 我正在这里学习 Spring 教程; 使用 RabbitMQ 发送消息 我发现了这个问题,但它没有解决我对教程中找到docker-compose.yml文件的查询; Spring RabbitMQ 教程导致 Connection Refused 错误 在应用程序实际运行之前,我已经完成了所有必要的步骤,此时我收到ConnectException异常,表明服务器未运行或未正确运行。 教程中指定的docker-compose.yml文件如下; rabbitmq: image: rabbitmq:management ports: - "5672:5672" - "15672:15672" 基本上我不确定这个 docker-compose 文件实际上做了什么,因为它似乎没有像教程建议的那样设置 RabbitMQ 服务器(或者至少不是教程期望的方式)。 我对 Docker 也很陌生,所以也许我认为这个文件会运行 RabbitMQ 服务器的新实例是错误的。 当我运行docker-compose up我得到以下控制台输出; rabbitmq_1 | rabbitmq_1 | =INFO REPORT==== 28-Jun-2017::13:27:26 === rabbitmq_1 | Starting RabbitMQ 3.6.10 on Erlang 20.0-rc2 rabbitmq
  • 如何使用 pgAdmin 连接 docker 容器上的 postgresql 图像?(How to use pgAdmin to connect postgresql image on a docker container?)
    问题 我刚刚从 GitHub 克隆了一个项目,在自述文件中它要求我运行docker-compose up以运行 PostgreSQL 映像... 我假设在我运行命令后,PostgreSQL 服务器映像将使用端口 5432 在我电脑上的 Docker 容器中启动。然后我运行npm install和npm start来启动项目(数据库表将使用 ORM 框架自动创建)。 但是,当我打开 pgAdmin 连接到服务器时,它说它已成功连接,但我找不到创建的那些表。 在这里,我猜 pgAdmin 没有连接 5432 上的 PostgreSQL 服务器(Docker 映像)...所以我的问题是是否可以使用安装在我本地 pc 中的 pgAmin 连接到已经运行的 PostgreSQL 服务器 Docker 映像,映射到我本地 PC 的端口 5432? 回答1 是的,您可能只需要从 Docker 容器获取 Ip 地址,运行下一个命令即可到达。 docker ps 然后使用 ID 容器: docker inspect ID container 从 Docker 配置中按 IP 地址搜索并使用它从 pgAdmin 连接。 回答2 docker ps --format "table {{.Names}}\t{{.ID}}" | grep 'postgres' 上面的命令将给出通过 docker 运行的
  • 无法将 python 包下载到 Docker 映像上(Can't download python packages onto Docker image)
    问题 我一直在这里关注官方文档。 我的Dockerfile 、 app.py和requirements.txt与教程中给出的相同。 当我尝试使用docker build -t friendlyhello . -tfriendlyhello 构建我的 Docker 映像时docker build -t friendlyhello . 当 docker 运行RUN pip install -r requirements.txt部分时,我收到以下错误: 重试(重试(总计 = 4,连接 = 无,读取 = 无,重定向 = 无))连接被“NewConnectionError(”:无法建立新连接:[Errno -2] 名称或服务未知”,) ':/简单/烧瓶/ 我已经检查了这个并尝试了所有建议的解决方案似乎都不起作用。 提前致谢。 编辑1:我的requirements.txt Flask Redis 完整的输出 Sending build context to Docker daemon 4.608 kB Step 1/7 : FROM python:2.7-slim ---> 4ba53c70eb04 Step 2/7 : WORKDIR /app ---> Using cache ---> bebf675fc3bd Step 3/7 : ADD . /app ---> Using cache
  • 将 docker-compose 连接到外部数据库(Connect docker-compose to external database)
    问题 我设置了 4 个需要相互通信的容器,其中两个需要连接到外部数据库。 我开始与作曲家合作并将所有内容链接在一起。 容器可以毫无问题地相互通信,但是它们无法连接到外部数据库。 外部数据库已启动并正在运行,我可以通过 shell 轻松连接到它。 docker-compose 文件如下所示: version: "3" services: bridge: # version => 2.1.4 build: ./lora-gateway-bridge ports: - "1680/udp:1700/udp" links: - emqtt - redis environment: - MQTT_SERVER=tcp://emqtt:1883 networks: - external restart: unless-stopped loraserver: # version => 0.16.1 build: ./loraserver links: - redis - emqtt - lora-app-server environment: - NET_ID=010203 - REDIS_URL=redis://redis:6379 - DB_AUTOMIGRATE=true - POSTGRES_DSN=${SQL_STRING} ###<- connection string - BAND
  • Docker 容器中 sqlserver 的连接字符串(connection string for sqlserver in Docker container)
    问题 我正在使用带有 dotnet Core 和 EF Core 的 Visual Studio 2017 for mac。 在 Docker 容器中设置 mssql 映像后,我试图添加连接字符串但抛出连接错误。 我尝试使用不同的选项,例如 ip address 、 container name 、 host name 等作为服务器名称,但它们都不起作用。 "Default": "Server=172.17.0.2; Database=ERPDb; User=sa; Password =******;" 带容器名称 "Default": "Server=ecstatic_hermann; Database=ERPDb; User=sa; Password=******;" 使用主机名: "Default": "Server=f45840a59623; Database=ERPDb; User=sa; Password=******;" 通过在终端中使用 localhost 进行连接时,成功连接 $ mssql -s localhost -p Technocrat123 Connecting to localhost...done sql-cli version 0.6.2 Enter ".help" for usage hints. 但是在运行应用程序时连接失败。 感谢任何帮助。
  • 在 Visual Studio 2012 中,.SDF 文件不替换(提交)我对原始文件的更改(In visual Studio 2012 .SDF file not replacing (committing) my changes to original file)
    问题 我在插入 SQL CE 数据库时遇到问题。 我写了一些代码,然后当我需要一个数据库时,我右键单击了投影,添加了新项目Local Database ,然后它让我选择一个数据模型 - 我选择了“数据集”。 这为我在左侧的服务器资源管理器下创建了一个数据库,在我的右侧,在解决方案资源管理器中可以看到相同的 .sdf 文件。 我启动了我的应用程序,我运行了一个插入查询,它给了我插入成功的输出,我看到 root/bin/Debug/db.sdf 下的 .sdf 文件刚刚被修改,我关闭了我的应用程序,但我的原始数据库位于在/root/db.sdf。 如果我从服务器资源管理器查询数据库,我看不到更改/插入的行。 这是我使用的代码: 首先,我尝试了 sever Data Source 选项,所有未注释的选项对我都不起作用。 //String connectString = @"Data Source=" + '"' + @"C:\Users\Alex\Documents\Visual Studio 2012\Projects\my\my\myDB.sdf;" + '"'; //String connectString = "Data Source:=" + '"' + @"C:\Users\Alex\Documents\Visual Studio 2012\Projects\my\my\my
  • 如何在Docker容器之间设置链接,以便重启不会中断它?(How do I set up linkage between Docker containers so that restarting won't break it?)
    问题 我有一些运行如下的Docker容器: Nginx的网路应用程式1 网路应用程式2 PostgreSQL的 由于Nginx需要连接到Web应用程序1和2中的Web应用程序服务器,并且Web应用程序需要与PostgreSQL通讯,所以我有这样的链接: Nginx ---链接---> Web应用程序1 Nginx ---链接---> Web应用程序2 Web应用程序1 ---链接---> PostgreSQL Web应用程序2 ---链接---> PostgreSQL 起初这很好用。 但是,当我开发Web应用程序1和Web应用程序2的新版本时,需要替换它们。 我要做的是删除Web应用程序容器,设置新容器并启动它们。 对于Web应用程序容器,其IP地址起初类似于: 172.17.0.2 172.17.0.3 在更换它们之后,它们将具有新的IP地址: 172.17.0.5 172.17.0.6 现在,Nginx容器中那些暴露的环境变量仍然指向旧的IP地址。 问题来了。 如何更换容器而不破坏容器之间的链接? PostgreSQL也将发生相同的问题。 如果要升级PostgreSQL映像版本,我当然需要删除它并运行新的映像,但是然后我需要重建整个容器图,因此对于实际的服务器操作而言,这不是理想的选择。 回答1 --link的效果是静态的,因此它不适用于您的情况(尽管可以删除链接
  • 使用Docker启动MySQL数据库
    在本文中,将来学习如何使用Docker CLI和Docker compose启动MySQL容器。如果你正在开发需要数据存储的应用程序,则MySQL是一种流行的SQL数据库。以前从未使用过MySQL或数据库都没关系-本教程将学习并熟悉启动Docker容器的过程。这些概念可以应用于应用程序所需的任何依赖项。 1、在Docker Hub上找到合适的MySQL映像访问Docker Hub,然后在搜索框中输入以找到包含官方图像的页面: MySQLDocker存储库提供一个或多个受支持的标签,它们是映像的变体。通常,如果发行版使用语义版本控制,则标记将与应用程序的MAJOR.MINOR.PATCH编号匹配。对于MySQL,可以从各种版本的5.6、5.7或8.0中进行选择:如果你选择了一个精确的版本,比如8.0.22,MySQL的那个版本将永远被安装。 选择主版本和副版本,比如8.0,将安装副版本的最新版本。现在可能是8.0.22,明天变成8.0.23。 只选择主版本,例如8,将安装最新的主版本。现在可能是8.0.22,但下周可能变成8.1.0。 选择latest(或不指定标签)将安装最新的版本,而不管版本是什么。现在可能是8.0.22,但下个月可能是9.0.0或更高版本。 对于本例,latest是一个很好的选择,但是应该尝试匹配生产服务器上的版本,或者选择一个精确的版本