怎么在docker上装elmlang可视调试编码器ellie
这篇文章主要讲解了"怎么在docker上装elmlang可视调试编码器ellie",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么在docker上装elmlang可视调试编码器ellie"吧!
好了,在针对prod的dockerfile和docker-compose.yml作修改之前,先改几个源码中的文件:
配置文件config/prod.exs中的config :ellie, Ellie.Repo段
在adpter条目下增加:
username: "postgres", password: "postgres", database: "ellie", hostname: "database", port: 5432, ssl: false,
以上是ellie container实例启动时连接postgresql实例的配置。
database是数据库所在主机的主机名,docker-compose.yml中数据库 postgresql9.5对应container的ID,一般是database,对于那个ssl,如果不加ssl,会在运行时出现ssl not avaliable
config :logger段也换成这个:config :logger, :console, format: "[$level] $message\n",否则接下来被一个run.sh包含的phx.server控制台不出任何信息。
assets/package-lock.json中,找到natives,升级一下其版本
"natives": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz" },
以上是为了在防止nodejs在编译deps时出现natives有关的错误。
dockerfile中:
DEPS下加一段安装postgresql-client:
# Install postgres-clientRUN echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main" >> /etc/apt/sources.list.d/pgdg.list \ && wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | apt-key add - \ && apt-get update \ && apt-get -yq --no-install-recommends install inotify-tools postgresql-client-9.5
然后就是dockerfile主体部分了:
# Download Elm platform binariesRUN mkdir -p /tmp/elm_bin/0.18.0 && mkdir -p /tmp/elm_bin/0.19.0 \ # goon executable for Procelain Elixir library, to run executables in Elixir processes && wget -q https://github.com/alco/goon/releases/download/v1.1.1/goon_linux_386.tar.gz -O /tmp/goon.tar.gz \ && tar -xvC /tmp/elm_bin -f /tmp/goon.tar.gz \ && chmod +x /tmp/elm_bin/goon \ && rm /tmp/goon.tar.gz \ # Elm Platform 0.18 && wget -q https://github.com/elm-lang/elm-platform/releases/download/0.18.0-exp/elm-platform-linux-64bit.tar.gz -O /tmp/platform-0.18.0.tar.gz \ && tar -xvC /tmp/elm_bin/0.18.0 -f /tmp/platform-0.18.0.tar.gz \ && rm /tmp/platform-0.18.0.tar.gz \ # Elm Format 0.18 && wget -q https://github.com/avh5/elm-format/releases/download/0.7.0-exp/elm-format-0.18-0.7.0-exp-linux-x64.tgz -O /tmp/format-0.18.0.tar.gz \ && tar -xvC /tmp/elm_bin/0.18.0 -f /tmp/format-0.18.0.tar.gz \ && rm /tmp/format-0.18.0.tar.gz \ && chmod +x /tmp/elm_bin/0.18.0/* \ # Elm Platform 0.19 && wget -q https://github.com/elm/compiler/releases/download/0.19.0/binaries-for-linux.tar.gz -O /tmp/platform-0.19.0.tar.gz \ && tar -xvC /tmp/elm_bin/0.19.0 -f /tmp/platform-0.19.0.tar.gz \ && rm /tmp/platform-0.19.0.tar.gz \ && chmod +x /tmp/elm_bin/0.19.0/* \ # Elm Format 0.19 && wget -q https://github.com/avh5/elm-format/releases/download/0.8.0-rc3/elm-format-0.19-0.8.0-rc3-linux-x64.tgz -O /tmp/format-0.19.0.tar.gz \ && tar -xvC /tmp/elm_bin/0.19.0 -f /tmp/format-0.19.0.tar.gz \ && rm /tmp/format-0.19.0.tar.gz \ && chmod +x /tmp/elm_bin/0.19.0/* \ # 以上都是准备elmlang的binaries到tmp下的原逻辑,,以下准备整个app执行环境,命名为tmp2是为了将这二步骤以对应的方式列出。 # 这里的tmp2,其实对应原版的dockerfile中是 add . /app,只是原版的构建出来在单机跑起来没事,在迁移安装到别的docker主机上跑起来,会提示找不到文件(定位不到正确的app顶层。所以deps.get时会找不到package.json等,entrypoint也找不到run.sh)。你多构建几次原版dockerfile与这里对比就知道了。 # 你可能已经注意到这条很长的RUN,它将所有关于生成app的逻辑都维持在一个RUN中,否则就超了docker构建时的分层文件系统了,会导致不意料的事情发生。猜测原版 add . /app 就是没有维持在同一个文件系统中。docker-compose.yml中的volume也会不能生效。 && git clone https://github.com/minlearn/ellie-corrected /tmp2 \ && mkdir -p /tmp2/priv/bin \ && cp -r /tmp/elm_bin/* /tmp2/priv/bin \ && mkdir -p /tmp2/priv/elm_home \ # 安装elixir相关的所有扩展并生成项目的数据库文件 && cd /tmp2 \ && mix deps.get \ && mix compile \ && mix do loadpaths, absinthe.schema.json /tmp2/priv/graphql/schema.json \ ## 安装nodejs相关的所有扩展,并生成项目的webpack静态文件 && cd /tmp2/assets \ && npm install \ && npm run graphql \ && npm run build
至此,生成构建了所有项目运行时的资源。
已经差不多可以运行了。准备ENV预定义的参数,docker run时会欠入到实例:
ENV MIX_ENV=prod \ NODE_ENV=production \ PORT=4000 \ ELM_HOME=/tmp2/priv/elm_home \ SECRET_KEY_BASE="+ODF8PyQMpBDb5mxA117MqkLne/bGi0PZoTl5uIHAzck2hDAJ8uGJPzark0Aolyi"
定义运行
# WORKDIR的主要作用就是定义接下来所有指令,尤其是entrypoint等的路径WORKDIR /tmp2EXPOSE 4000RUN chmod +x /tmp2/run.shENTRYPOINT ["/tmp2/run.sh"]
这个run.sh是分离postgresql所在容器和ellie所在容器的entrypoint,所有连接数据库初始化的工作都要在这里完成,因为它继承了ENV关于prod的预埋参数所以运行时不会出错,否则比如在非docker构建的情况下,你把mix phx.server单独在命令行中执行,会出现如下错误:(EXIT) no process: the process is not alive or there's no process currently associated with the given name。你就需要在run.sh中export所有这些参数,这也是docker的联合文件系统在编译(dockerfile)/运行(run.sh)不同阶段需要做到逻辑同步的要求。
run.sh的内容(它是git repos中要新增的一个文件,需提交到新git repos中):
#! /usr/bin/env bashset -ecd /tmp2until PGPASSWORD=postgres psql -h "database" -U "postgres" -c '\q'; do >&2 echo "Postgres is unavailable - sleeping" sleep 5donemix ecto.createmix ecto.migratemix phx.server
最后,docker-compose.yml也一目了然了。
ellie: image: minlearn/ellie-corrected links: - database:database ports: - 4000:4000 restart: always environment: - SERVER_HOST=52.81.25.39database: image: postgres:9.5 environment: - POSTGRES_PASSWORD=postgres restart: always
minlearn/ellie-corrected是我在dockerhub上编译正确的ellie,实际上,上面的ellie的volumes同样是没有起作用的。留给其它人解决吧(这就是分层文件系统给人理解上带来的极大不便)。反正项目部署到任何支持docker的机器都可以启动并进入ellie所在IP:4000的界面了。
假设上面的没加SERVER_HOST,进去你会发现ip:4000/new显示ellie的动画,但一直hangout,控制台显示,[error] Could not check origin for Phoenix.Socket transport.
这就需要设置SERVER_HOST=ip变量了(这个ip是你部署ellie所在机器的外网IP或被访问IP:4000所在的IP),这个变量不能放在dockerfile中,也不能放在run.sh中(因为这二个文件要做进docker image中的,而你无法预知要将这个docker image放哪个IP的主机上),故要放在docker-compose.yml中ellie段下在实际开启ellie container时指定,比如我部署运行时的IP是52.81.25.39。
感谢各位的阅读,以上就是"怎么在docker上装elmlang可视调试编码器ellie"的内容了,经过本文的学习后,相信大家对怎么在docker上装elmlang可视调试编码器ellie这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!