[英]How to escape ' in docker-compose entrypoint
我想用它在 docker-compose up -d 上創建數據庫和初始化用戶
entrypoint:
sh -c "
echo 'CREATE DATABASE IF NOT EXISTS firstDB;CREATE DATABASE IF NOT EXISTS secondDB;' > /docker-entrypoint-initdb.d/init.sql;
/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
"
這工作得很好,但問題來了
sh -c "echo 'CREATE DATABASE IF NOT EXISTS firstDB;CREATE DATABASE IF NOT EXISTS secondDB;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;' > /docker-entrypoint-initdb.d/init.sql;
/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
"
我試圖用 '' 或 \\' 轉義 ' .... 沒有任何效果。
任何幫助請如何逃避 ' ?
謝謝
對於此用例,您不需要這樣做。 創建一個包含該字符串的本地文件init.sql
; 因為它只是一個文件,你根本不需要做任何 shell 轉義。 使用volumes:
聲明將文件掛載到容器中,並使用圖像的默認入口點。 例如:
version: '3'
services:
mysql:
image: 'mysql:8'
volumes:
- 'mysql:/var/lib/mysql'
- './init.sql:/docker-entrypoint-initdb.d/init.sql' # <-- this
ports:
- '5432:5432'
volumes:
mysql:
如果您有多個文件,您可以將它們放在一個共享目錄中,並將整個目錄掛載到容器中。 如果您需要像您展示的特殊選項,您可以將這些選項(僅)作為command:
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
如果你真的需要把它作為一個復雜的腳本來做,我建議把它寫成一個 shell 腳本,而不是嘗試內聯; 它節省了一級引用,你可以使用像heredocs這樣的shell功能來進一步簡化這一點。 我可能會將其構建到自定義映像中,但您可以按照與上述相同的方式將其安裝到容器中。
如果所有其他方法都失敗了,您可以嘗試在本地 shell 中運行該命令,但將echo
放在它前面,或者從sh -c
包裝器中刪除第二個命令。 這將在 shell 完成所有引用和其他擴展后打印命令行,以便您更清楚地了解寫出的內容。
echo sh -c "echo 'CREATE DATABASE ...'"
(如果您需要在帶引號的字符串內的帶引號的字符串中寫出文字引號,這很糟糕。我可能嘗試的一種變體是將echo
參數包裝在雙引號中,需要對其進行轉義,因為它們位於雙引號內細繩
sh -c "echo \"CREATE ... 'root'%'@' ...\" > /docker-entrypoint-initdb.d/init.sql"
嗯我有點困惑
db:
image: mysql:latest
container_name: mysql
restart: always
networks:
my-container-net:
ipv4_address: 172.16.30.10
ports:
- 60000:3306
command : --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: pass
volumes:
- ./mysql:/var/lib/mysql
entrypoint:
sh -c "echo \"CREATE DATABASE IF NOT EXISTS spotweb;CREATE DATABASE IF NOT EXISTS nextcloud;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;CREATE DATABASE IF NOT EXISTS spotweb;CREATE DATABASE IF NOT EXISTS nextcloud;CREATE USER IF NOT EXISTS 'spotweb'@'localhost' identified with mysql_native_password by 'spotpass';CREATE USER IF NOT EXISTS 'spotweb'@'%' identified with mysql_native_password by 'spotpass';CREATE USER IF NOT EXISTS 'nextcloud'@'localhost' IDENTIFIED BY 'nextpass';CREATE USER IF NOT EXISTS 'nextcloud'@'%' IDENTIFIED BY 'nextpass';GRANT ALL PRIVILEGES ON spotweb.* TO 'spotweb'@'localhost';GRANT ALL PRIVILEGES ON spotweb.* TO 'spotweb'@'%';GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'%';FLUSH PRIVILEGES;\" > /docker-entrypoint-initdb.d/init.sql;/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci"
mySQL Server 啟動,但沒有創建用戶或數據庫:-(
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.