首页 > 解决方案 > Docker - 在构建阶段安全地设置 MySQL/MariaDB 根密码

问题描述

我正在尝试创建一个 docker build/compose,我可以在其中安全地在构建/运行时为我的 MariaDB 服务器设置 root 密码,而不必在 shell 中通过docker exec. 我想成为一个完全不干涉的构建。

我已经尝试了多种方法来让它工作,包括 BuildKit 的秘密,但如果可能的话,我会尽量避免使用 Swarm。我读到可以使用它来做到这一点,docker compose所以我为它编写了一个 YAML,但它似乎不起作用。

compose 似乎工作正常,但是当我尝试使用以下命令从转储更新我的数据库时(这个 exec 只是为了测试非常好,它不是放手的):

docker exec -i my_db_containter mysql -uroot -pmypassword < dbserver/sqlconfig/db_dump.sql

我收到此错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

任何人都可以发现我在这里可能做错了什么,是否能够提出一种替代解决方案来以这种方式设置服务器根密码?

--

编辑:在做了更多阅读之后,似乎这种方法也不是那么安全,因为它似乎只是在容器中安装了一个只读文件?有没有人对我如何自动安全地设置 MYSQL_ROOT_PASSWORD 有任何建议,理想情况下没有 swarm?如果 swarm 真的是唯一的选择,那么我想我可以调查一下。

--

这是我到目前为止所拥有的:

码头工人-compose.yaml:

version: '3.9'

services:
  db:
    build:
      context: "./dbserver"
    container_name: 'my_db_container'
    environment:
      MYSQL_DATABASE: 'my_db'
      MYSQL_ROOT_PASSWORD: /run/secrets/dbrootpass
    networks:
      my_net:
        ipv4_address: 203.0.113.88
    secrets:
      - dbrootpass

networks:
  my_net:
    ipam:
      driver: default
      config:
        - subnet: "203.0.113.0/24"

secrets:
  dbrootpass:
    file: ./rootpass

根密码:

mypassword

标签: mysqldockerdocker-composedockerfilemariadb

解决方案


创建秘密:

$ read -p "Enter variable for MARIADB_ROOT_PASSWORD : " token && echo -n "$token" | podman secret create "MARIADB_PASSWORD" -
Enter variable for MARIADB_ROOT_PASSWORD : whynot
7f3b681f9a05729ad5b6af9d5

$  podman run --secret=MARIADB_ROOT_PASSWORD,type=env   --secret=MARIADB_PASSWORD,type=env  --env MARIADB_USER=bob  mariadb:10.5

内部容器:

$ podman exec -ti funny_cohen  bash
root@2583f8620571:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
mysql          1       0  0 03:31 ?        00:00:00 mysqld
root         143       0  0 03:32 pts/0    00:00:00 bash
root         146     143  0 03:32 pts/0    00:00:00 ps -ef
root@2583f8620571:/# printenv
GPG_KEYS=177F4010FE56CA3336300305F1656F24C74CD1D8
PWD=/
MARIADB_USER=bob
container=podman
HOME=/root
MARIADB_VERSION=1:10.5.10+maria~focal
GOSU_VERSION=1.12
TERM=xterm
MARIADB_MAJOR=10.5
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/printenv

然而,它确实出现了podman inspect funny_cohen


推荐阅读