docker - Docker:用 docker-compose 中的秘密替换文件内容
问题描述
我正在尝试使用 docker 和 docker-compose 设置具有模式和一些用户的数据库。用户是 Web 应用程序的系统用户,它需要密码以确保安全。为此,我想我可以简单地将文件中的模板值替换为密钥中的值。但是,这不起作用。
用秘密值替换文件内容的正确方法是什么?
Dockerfile
FROM postgres:12.4
EXPOSE 5432
COPY 00_users.sql /docker-entrypoint-initdb.d/
COPY 01_schema.sql /docker-entrypoint-initdb.d/
RUN sed -i "s/__SECRETPASSWORD__/$(cat /run/secrets/postgres-secret)/g" /docker-entrypoint-initdb.d/00_users.sql
码头工人撰写
version: '3.1'
services:
my-db:
build: ./my-db
container_name: my-postgres
volumes:
- ntool-data:/var/lib/postgresql/data
ports:
- 5432:5432
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres-passwd
secrets:
- postgres-passwd
- postgres-secret
secrets:
postgres-passwd:
file: postgres-passwd.txt
postgres-secret:
file: postgres-secret.txt
输出是:
Step 5/5 : RUN sed -i "s/__VCNTOOLPASSWORD__/$(cat /run/secrets/postgres-secret)/g" /docker-entrypoint-initdb.d/00_users.sql
---> Running in 012dd81c830b
cat: /run/secrets/postgres-secret: No such file or directory
解决方案
我最终创建了这个00_users.sh
脚本并将其放入/docker-entrypoint-initdb.d/
Dockerfile
FROM postgres:12.4
EXPOSE 5432
COPY 00_users.sh /docker-entrypoint-initdb.d/
内容:
#!/bin/bash
set -e
MYPASS=$(cat /run/secrets/postgres-secret)
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER secretuser SUPERUSER ;
ALTER USER secretuser WITH PASSWORD '${MYPASS}';
EOSQL
推荐阅读
- python - Tensorflow Estimator 中的 TFHub 嵌入特征列
- ionic-framework - 如何解决:无法确定类 OverlayPortal 的模块
- python - 使用 2D 输入训练 Sci-kit Learn 神经网络
- knockout.js - 使用身份验证令牌从安全服务器加载 requirejs 模块
- apache - Apache CXF Swagger UI JSON 文件不显示任何内容
- string - 切片包含 Unicode 字符的字符串
- android - 使用 mvvm 实现启动画面时出现此错误
- android - JobScheduler Android Oreo 问题
- django - 在 django forms.py 中获取 URL pk
- mysql - MySQL / MariaDB:如何在基于时间的数据中找到差距?