Docker,MySQL - 在 .sh 文件中找不到命令

Posted

技术标签:

【中文标题】Docker,MySQL - 在 .sh 文件中找不到命令【英文标题】:Docker, MySQL - command not found in .sh file 【发布时间】:2019-04-12 16:02:04 【问题描述】:

我刚刚设置了一个Dockerfile 和一个docker-compose.yml。并且由于某种原因,Docker 无法运行此脚本。每当运行此脚本时,它都会遍历所有 SQL 文件并迁移该文件。

#!/bin/bash

DB_NAME="database_name"
DB_USER="username"
DB_PASS="password"
DB_HOST="localhost"

#get current version
GET_DATABASE_VERSION="SELECT name FROM version TOP 1"
#

echo "Getting data version"
version=$(mysql -h$DB_HOST -u$DB_USER -p$DB_PASS $DB_NAME -e "SELECT name FROM version")
#trim string to get current version name
version=$version:5
x="./config/scripts/migration/$version"
echo $version
MIGRATION_PATH="./config/scripts/migration/*"
#get migration file for newer version
for filename in $MIGRATION_PATH -maxdepth 2
do
    if [[ -f $filename ]]; then
        if [[ "$filename" > "$x" ]] || [ "$filename" == "$x" ]; then
            echo "Running migration file: $filename"
            mysql -h$DB_HOST -u$DB_USER -p$DB_PASS $DB_NAME < $filename
        fi
    fi
done

我不断收到错误消息./config/scripts/migrate_local.sh: line 25: mysql: command not found 这是这一行mysql -h$DB_HOST -u$DB_USER -p$DB_PASS $DB_NAME &lt; $filename

我该如何解决这个问题?这里是Dockerfiledocker-compose.yml,我用sudo docker-compose up --build跑。

文件 Dockerfile

FROM node:8
MAINTAINER Tri Nguyen "me@mydomain.com"

RUN mkdir -p /usr/src
WORKDIR /usr/src

COPY package.json /usr/src
RUN npm install
RUN npm rebuild node-sass --force
COPY . /usr/src

EXPOSE 3000 8000
CMD [ "npm", "start" ]

文件 docker-compose.yml

version: "2"
services:
  universe:
    build: .
    working_dir: /usr/src
    environment:
    - NODE_ENV=default
    - PORT=3000
    volumes:
    - /usr/src
    ports:
    - "3000:3000"
    - "8000:8000"
    links:
    - redis
    - mysql

  redis:
    image: redis
    volumes:
    - /data/redis:/data

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: "database_name"
      MYSQL_USER: "username"
      MYSQL_PASSWORD: "password"
    volumes:
    - /data/mysql:/var/lib/mysql

我使用winston 作为我的记录器。但是,它不起作用,但console.log 可以正常工作。这可能是错误:

universe_1  |   errno: 'ECONNREFUSED',
universe_1  |   code: 'ECONNREFUSED',
universe_1  |   syscall: 'connect',
universe_1  |   address: '127.0.0.1',
universe_1  |   port: 3307,
universe_1  |   fatal: true

【问题讨论】:

这个脚本在哪里运行?在你的universe 图片上? @EmruzHossain 没错,这是在universe 图像中运行的脚本chmod +x ./config/scripts/dbsetup_local.sh &amp;&amp; ./config/scripts/dbsetup_local.sh。我更新了我发现的内容,这可能是错误 【参考方案1】:

您的universe 映像没有安装mysql 命令行工具。您必须在构建 Docker 映像时安装它。

试试下面的 Dockerfile:

FROM node:8
MAINTAINER Tri Nguyen "me@mydomain.com"

RUN mkdir -p /usr/src
WORKDIR /usr/src

COPY package.json /usr/src
RUN npm install
RUN npm rebuild node-sass --force
RUN set -ex; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
    mysql-client

COPY . /usr/src

EXPOSE 3000 8000
CMD [ "npm", "start" ]

【讨论】:

谢谢。它解决了上述问题,但出现了这个问题ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 尝试使用DB_HOST="127.0.0.1" 而不是DB_HOST="localhost"。参考:help.memsql.com/hc/en-us/articles/… 我收到了ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)。我认为localhost 是正确的,这是经过/var/run/mysqld/mysqld.sock 许可的事情 你能从本地机器访问mysql数据库吗? 是的,它运行得非常好

以上是关于Docker,MySQL - 在 .sh 文件中找不到命令的主要内容,如果未能解决你的问题,请参考以下文章

sh 在docker setup之后设置正确的mysql配置文件权限

sh 使用定时文件名备份docker里面的mysql

docker搭建apache+php+mysql

sh 在Docker中备份MySQL

sh 在docker里面备份mysql

sh 在docker中恢复mysql数据库