Google的Elixir-phoenix-compute-engine问题

时间:2019-02-26 02:46:28

标签: google-cloud-platform elixir google-compute-engine phoenix-framework

我正在按照本教程尝试部署到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

我不确定需要什么信息来解决此问题

请务必提供信息,我会提供。 谢谢

2 个答案:

答案 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

谢谢大家的帮助!