我正在按照本教程尝试部署到GCP Compute Engine https://cloud.google.com/community/tutorials/elixir-phoenix-on-google-compute-engine
创建防火墙规则后无法连接到提供的外部IP
遵循本教程没有任何错误。但是创建防火墙规则后无法连接到http://${external_ip}:8080
内部版本已在Google Cloud Storage中
我复制了hello
gsutil cp _build/prod/rel/hello/bin/hello\
gs://${BUCKET_NAME}/hello-release
代替hello.run
gsutil cp _build/prod/rel/hello/bin/hello.run \
gs://${BUCKET_NAME}/hello-release
我的instance-startup.sh
#!/bin/sh
set -ex
export HOME=/app
mkdir -p ${HOME}
cd ${HOME}
RELEASE_URL=$(curl \
-s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/release-url" \
-H "Metadata-Flavor: Google")
gsutil cp ${RELEASE_URL} hello-release
chmod 755 hello-release
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 \
-O cloud_sql_proxy
chmod +x cloud_sql_proxy
mkdir /tmp/cloudsql
PROJECT_ID=$(curl \
-s "http://metadata.google.internal/computeMetadata/v1/project/project-id" \
-H "Metadata-Flavor: Google")
./cloud_sql_proxy -projects=${PROJECT_ID} -dir=/tmp/cloudsql &
PORT=8080 ./hello-release start
gcloud compute instances get-serial-port-output
显示
...
Feb 23 18:02:35 hello-instance startup-script: INFO startup-script: + PORT=8080 ./hello-release start
Feb 23 18:02:35 hello-instance startup-script: INFO startup-script: + ./cloud_sql_proxy -projects= hello -dir=/tmp/cloudsql
Feb 23 18:02:35 hello-instance startup-script: INFO startup-script: 2019/02/23 18:02:35 Rlimits for file descriptors set to {&{8500 8500}}
Feb 23 18:02:35 hello-instance startup-script: INFO startup-script: ./hello-release: 31: exec: /app/hello_rc_exec.sh: not found
Feb 23 18:02:39 hello-instance startup-script: INFO startup-script: 2019/02/23 18:02:39 Listening on /tmp/cloudsql/hello:asia-east1:hello-db/.s.PGSQL.5432 for hello:asia-east1: hello-db
Feb 23 18:02:39 hello-instance startup-script: INFO startup-script: 2019/02/23 18:02:39 Ready for new connections
Feb 23 18:08:08 hello-instance ntpd[656]: kernel reports TIME_ERROR: 0x41: Clock Unsynchronized
hello_rc_exec.sh
是在初始化Distillery之后生成的。它存储在_build/prod/rel/hello/bin/hello_rc_exec.sh
firewall rules
NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED
default-allow-http-8080 default INGRESS 1000 tcp:8080 False
...
我还在实例中的ps aux | grep erl
中运行
hello_team@hello-instance:~$ ps aux | grep erl
hello_t+ 23166 0.0 0.0 12784 1032 pts/0 S+ 08:04 0:00 grep erl
我不确定需要什么信息来解决此问题
请务必提供信息,我会提供。 谢谢
答案 0 :(得分:0)
为后代,这是解决方法(worked out in this forum thread)。
首先,发布者已将hello
文件而非hello.run
上传到云存储。本教程特意指定上传hello.run
,因为它是整个发行版的完整可执行存档,而hello
只是一个包装脚本,其本身不能执行该应用程序。因此,对该过程的修改需要恢复。
第二,海报的应用程序包括elixir_bcrypt
库。该库包含一个NIF,其平台特定的二进制代码构建在deps
目录中(而不是_build
目录中)。本教程的过程无法正确进行交叉编译以进行部署之前清除deps
中的二进制文件,因此发布者的macOS构建的bcrypt库泄漏到了构建中。在Debian上部署到计算引擎时,初始化时会崩溃。发布者通过删除deps
目录并在交叉编译时重新安装依赖项来解决此问题。
在讨论中还注意到,该教程提倡了一种不良做法,即在进行Docker交叉编译时将用户的应用程序挂载到一个卷中。相反,它应该仅将应用程序复制到映像中,在该映像中执行整个构建,然后使用docker cp
提取构建的工件。这种做法可以避免此问题。已提交work item来相应地修改本教程。
答案 1 :(得分:0)
解决方案是here。
谢谢大家的帮助!