2017-01-23 28 views
0

有很多文档,但没有具体说明Dockerfiles(或者我错过了它)。如何连接到App Engine定制运行时Dockerfile中的SQL实例?

我的app.yaml文件:

runtime: custom 
env: flex 
env_variables: 
    MYSQL_DSN: mysql:unix_socket=/cloudsql/project-name:europe-west1:test001;dbname=db001 
    MYSQL_USER: root 
    MYSQL_PASSWORD: 'qwerty' 

我Dockerfile:

FROM ubuntu:16.04 

ARG dbuser 
ENV dbuser ${MYSQL_USER} 
ARG dbpass 
ENV dbpass ${MYSQL_PASSWORD} 
ARG dbhost 
ENV dbhost ${MYSQL_DSN} 

RUN apt-get update 
RUN apt-get install mysql-client 
RUN mysql -h ${dbhost} -u ${dbuser} -p${dbpass} -e "CREATE DATABASE 'test';" 

文档如下:

+0

,你看到了什么错误?您是否将任何ips白名单? – koma

回答

1

mysql命令行不理解您传递的DSN语法。套接字和数据库必须分别传入。

此外,Dockerfile中的“运行”条目在构建泊坞窗图像时运行,在它实际在您的应用程序中运行之前。因此它没有可用的环境。此外,您可能不想在构建映像时配置或访问远程数据库。

这里有一个选择:

的app.yaml

runtime: custom 
env: flex 
env_variables: 
    MYSQL_SOCK: /cloudsql/project-name:europe-west1:test001 
    MYSQL_DB: db001 
    MYSQL_USER: root 
    MYSQL_PASSWORD: 'qwerty' 

your_program.sh

#!/bin/sh 
mysql -S $MYSQL_SOCK -u $MYSQL_DB -p$MYSQL_PASSWORD $MYSQL_DB -e "CREATE DATABASE 'test';" 

Dockerfile

FROM ubuntu:16.04 

RUN apt-get update 
RUN apt-get install mysql-client 
CMD ["your_program.sh"] 
+0

感谢大卫,我认为它也必须这样做,我的ENV变量似乎是空的。你知道我是如何将它们从yaml文件传递给docker文件的吗? –

+1

Dockerfile中的“RUN”命令在构建Docker镜像时执行,而不是实际上作为应用程序的一部分。所以你的应用中的env变量对他们来说是不可见的。运行mysql命令来编译dockerfile也没有意义......听起来你可能希望它在你的应用程序中运行。尝试将mysql调用移动到单独的shell脚本,并将其用作dockerfile的CMD或ENTRYPOINT。 – David

相关问题