簡體   English   中英

如何在 docker-compose 入口點中轉義 '

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM