【问题标题】:bash command for runniung multiple commands in docker container用于在 docker 容器中运行多个命令的 bash 命令
【发布时间】:2021-01-07 13:26:40
【问题描述】:

我正在尝试在 docker 容器内建立一个带有表的数据库。为了数据库的正确工作,我需要运行以下命令:

--default-authentication-plugin=mysql_native_password
ps:我不明白这个命令到底是做什么用的,但它通过设置数据库来防止一些奇怪的日志。

为了设置,我使用 docker-compose 如下:

db:
image: mysql
command: >
  bash -c "--init-file /pictureapi_mydb_response.sql
  && --default-authentication-plugin=mysql_native_password"
volumes:
  - ./pictureapi_mydb_response.sql:/pictureapi_mydb_response.sql
restart: always
ports:
  - 3307:3306
environment:
  MYSQL_ROOT_PASSWORD: ${DB_MYSQL_PASS}

source

我收到以下错误:

bash: --: 无效选项 db_1 |用法:bash [GNU 长选项] [选项] ...
db_1 | bash [GNU 长选项] [选项] 脚本文件 ...
db_1 | GNU 长选项:
db_1 | --调试
db_1 | --调试器\

如果 "bash" 指令不起作用,我应该如何实际运行两个或多个命令?

【问题讨论】:

  • 这些是实际的命令,还是mysqld的选项?
  • @DavidMaze 我想选项...

标签: mysql bash docker


【解决方案1】:

Docker Hub mysql 映像配置为,如果command:- 开头,则假定整个命令为mysqld 启动选项。它实际上不是“命令”,您不能使用bash 来运行它。如果您需要多个启动选项,只需将它们组合成一个 command:

command: --init-file /pictureapi_mydb_response.sql --default-authentication-plugin=mysql_native_password

当您启动 Docker 容器 its "entrypoint" and "command" parts are combined into a single command 时,如果两者都存在,该命令将作为附加参数传递给入口点。最常见的模式是命令本身就是一个完整的可执行命令,但还有另一种模式,入口点是(或提供)要运行的主命令,而命令只提供额外的选项。

Docker Hub mysql 容器有一个相当复杂的entrypoint script,但它最终以这样的逻辑结束:

# if command starts with an option, prepend mysqld
if [ "${1:0:1}" = '-' ]; then
    set -- mysqld "$@"
fi

也就是说,如果你运行一个容器

command: --an-option-starting-with-minus

容器运行的实际命令是mysqld --an-option-starting-with-minus。因此,如果您需要设置多个 mysqld 选项,您只需将它们作为“命令”传递,它们就会得到适当的处理。

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多