docker - 使用 docker : true 时获取堆栈以获取 GHCJS 内置 docker 图像

标签 docker haskell haskell-stack

作为我尝试制作 miso-isomorphic-stack 的一部分尽可能流畅的体验,我用 GHCJS 和一些更新的堆栈版本( repo herehub here)制作了几个 docker 图像,基于 these distributions .你可以在 repo 中看到如何使用它们,也许 this script了解如何更好地将其集成到您的流程中。

因此,理想情况下,您可以让堆栈管理 docker 镜像,方法如下:

resolver: lts-9.21
compiler: ghcjs-0.2.1.9009021_ghc-8.0.2
compiler-check: match-exact
setup-info:
ghcjs:
    source:
    ghcjs-0.2.1.9009021_ghc-8.0.2:
        url: https://github.com/matchwood/ghcjs-stack-dist/raw/master/ghcjs-0.2.1.9009021.tar.gz
        sha1: b1740c3c99e5039ac306702894cd6e58283f4d31

docker:
    enable: true
    repo: "tehnix/ghcjs-docker" # It will automatically add :lts-x.xx
    auto-pull: true
system-ghc: false

不幸的是,stack 将开始在主机系统上寻找 GHCJS,因此不会发现 GHCJS 已经构建在它正在使用的容器镜像中。我怀疑这与设置信息有关,但我并不完全清楚如何解决此问题。

我希望这里的人可能对堆栈有更多了解,以及编译器是如何处理的。

图像本身相当简单,它们只是在其中安装 GHCJS,这意味着您不必花费数小时自己构建 GHCJS,无论出现什么问题,都可以快速开始尝试 GHCJS。

更新

尝试@mgsloan 的建议失败,

No information found for ghcjs-0.2.1.9009021_ghc-8.0.2.
Supported versions for OS key 'source': GhcjsVersion 0.1.0.20150924 7.10.2

使用 stack -v build 的完整构建日志:

Version 1.6.3, Git revision b27e629b8c4ce369e3b8273f04db193b060000db (5454 commits) x86_64 hpack-0.20.0
2018-04-24 12:56:42.195877: [debug] Loading project config file frontend/stack.yaml
@(Stack/Config.hs:868:13)
2018-04-24 12:56:42.205781: [debug] Run process: /usr/local/bin/docker --version
@(System/Process/Log.hs:37:3)
2018-04-24 12:56:42.559527: [debug] Process finished in 353ms: /usr/local/bin/docker --version
@(System/Process/Log.hs:44:3)
2018-04-24 12:56:42.559917: [debug] Run process: /usr/local/bin/docker inspect tehnix/ghcjs-docker:lts-9.21
@(System/Process/Log.hs:37:3)
2018-04-24 12:56:42.643497: [debug] Process finished in 83ms: /usr/local/bin/docker inspect tehnix/ghcjs-docker:lts-9.21
@(System/Process/Log.hs:44:3)
2018-04-24 12:56:42.657949: [debug] Run process: /usr/local/bin/docker create --net=host -e STACK_IN_CONTAINER=1 -e STACK_ROOT=/Users/christiankjaerlaustsen/.stack -e STACK_PLATFORM_VARIANT=dkb61b2dc4e76119fbba7cceb60d5ffa49 -e HOME=/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home -e PATH=/opt/host/bin:/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home/.local/bin:/root/.cabal/bin:/root/.local/bin:/opt/ghc/8.2.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -e PWD=/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack -v /Users/christiankjaerlaustsen:/Users/christiankjaerlaustsen -v /Users/christiankjaerlaustsen/.stack:/Users/christiankjaerlaustsen/.stack -v /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend:/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend -v /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home:/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home -w /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack -e USER=christiankjaerlaustsen -e SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.D8v3WjTyAg/Listeners -v /private/tmp/com.apple.launchd.D8v3WjTyAg/Listeners:/private/tmp/com.apple.launchd.D8v3WjTyAg/Listeners -v /Users/christiankjaerlaustsen/.stack/programs/x86_64-linux/stack-1.6.3/stack:/opt/host/bin/stack -t -i tehnix/ghcjs-docker:lts-9.21 /opt/host/bin/stack --internal-re-exec-version=1.6.3 --internal-docker-entrypoint "DockerEntrypoint {deUser = Just (DockerUser {duUid = 501, duGid = 20, duGroups = [20,12,61,79,80,81,98,702,33,100,204,250,395,398,399,701], duUmask = 18})}" --stack-yaml=frontend/stack.yaml -v build
@(System/Process/Log.hs:37:3)
2018-04-24 12:56:42.909494: [debug] Process finished in 248ms: /usr/local/bin/docker create --net=host -e STACK_IN_CONTAINER=1 -e STACK_ROOT=/Users/christiankjaerlaustsen/.stack -e STACK_PLATFORM_VARIANT=dkb61b2dc4e76119fbba7cceb60d5ffa49 -e HOME=/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home -e PATH=/opt/host/bin:/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home/.local/bin:/root/.cabal/bin:/root/.local/bin:/opt/ghc/8.2.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -e PWD=/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack -v /Users/christiankjaerlaustsen:/Users/christiankjaerlaustsen -v /Users/christiankjaerlaustsen/.stack:/Users/christiankjaerlaustsen/.stack -v /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend:/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend -v /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home:/Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home -w /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack -e USER=christiankjaerlaustsen -e SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.D8v3WjTyAg/Listeners -v /private/tmp/com.apple.launchd.D8v3WjTyAg/Listeners:/private/tmp/com.apple.launchd.D8v3WjTyAg/Listeners -v /Users/christiankjaerlaustsen/.stack/programs/x86_64-linux/stack-1.6.3/stack:/opt/host/bin/stack -t -i tehnix/ghcjs-docker:lts-9.21 /opt/host/bin/stack --internal-re-exec-version=1.6.3 --internal-docker-entrypoint "DockerEntrypoint {deUser = Just (DockerUser {duUid = 501, duGid = 20, duGroups = [20,12,61,79,80,81,98,702,33,100,204,250,395,398,399,701], duUmask = 18})}" --stack-yaml=frontend/stack.yaml -v build
@(System/Process/Log.hs:44:3)
2018-04-24 12:56:42.910090: [debug] Creating process: /usr/local/bin/docker start -a -i 791fe386a759de5b23f7bf62a2cca15bdfa540287528024ec9931c4c69b4d913
@(System/Process/Log.hs:22:3)
Version 1.6.3, Git revision b27e629b8c4ce369e3b8273f04db193b060000db (5454 commits) x86_64 hpack-0.20.0
2018-04-24 10:56:48.844354: [debug] Loading project config file frontend/stack.yaml
@(Stack/Config.hs:868:13)
2018-04-24 10:56:48.856002: [debug] Run process: /usr/sbin/groupadd -o --gid 20 stack
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:48.887487: [debug] Process finished in 31ms: /usr/sbin/groupadd -o --gid 20 stack
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:48.890291: [debug] Run process: /usr/sbin/useradd -oN --uid 501 --gid 20 --home /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home stack
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:48.929204: [debug] Process finished in 38ms: /usr/sbin/useradd -oN --uid 501 --gid 20 --home /Users/christiankjaerlaustsen/GitHub/Tehnix/miso-isomorphic-stack/frontend/.stack-work/docker/_home stack
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:48.929360: [debug] Run process: /usr/sbin/groupadd -o --gid 20 group20
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:48.938691: [debug] Process finished in 9ms: /usr/sbin/groupadd -o --gid 20 group20
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:48.938807: [debug] Run process: /usr/sbin/groupadd -o --gid 12 group12
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:48.952149: [debug] Process finished in 13ms: /usr/sbin/groupadd -o --gid 12 group12
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:48.952316: [debug] Run process: /usr/sbin/groupadd -o --gid 61 group61
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:48.977534: [debug] Process finished in 25ms: /usr/sbin/groupadd -o --gid 61 group61
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:48.977670: [debug] Run process: /usr/sbin/groupadd -o --gid 79 group79
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:48.991099: [debug] Process finished in 13ms: /usr/sbin/groupadd -o --gid 79 group79
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:48.991271: [debug] Run process: /usr/sbin/groupadd -o --gid 80 group80
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.006803: [debug] Process finished in 14ms: /usr/sbin/groupadd -o --gid 80 group80
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.006984: [debug] Run process: /usr/sbin/groupadd -o --gid 81 group81
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.020884: [debug] Process finished in 13ms: /usr/sbin/groupadd -o --gid 81 group81
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.021037: [debug] Run process: /usr/sbin/groupadd -o --gid 98 group98
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.030441: [debug] Process finished in 9ms: /usr/sbin/groupadd -o --gid 98 group98
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.030551: [debug] Run process: /usr/sbin/groupadd -o --gid 702 group702
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.040424: [debug] Process finished in 9ms: /usr/sbin/groupadd -o --gid 702 group702
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.040532: [debug] Run process: /usr/sbin/groupadd -o --gid 33 group33
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.051412: [debug] Process finished in 10ms: /usr/sbin/groupadd -o --gid 33 group33
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.051632: [debug] Run process: /usr/sbin/groupadd -o --gid 100 group100
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.061282: [debug] Process finished in 8ms: /usr/sbin/groupadd -o --gid 100 group100
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.061803: [debug] Run process: /usr/sbin/groupadd -o --gid 204 group204
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.074834: [debug] Process finished in 12ms: /usr/sbin/groupadd -o --gid 204 group204
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.075014: [debug] Run process: /usr/sbin/groupadd -o --gid 250 group250
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.085177: [debug] Process finished in 9ms: /usr/sbin/groupadd -o --gid 250 group250
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.085324: [debug] Run process: /usr/sbin/groupadd -o --gid 395 group395
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.093166: [debug] Process finished in 7ms: /usr/sbin/groupadd -o --gid 395 group395
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.093303: [debug] Run process: /usr/sbin/groupadd -o --gid 398 group398
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.101006: [debug] Process finished in 7ms: /usr/sbin/groupadd -o --gid 398 group398
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.101161: [debug] Run process: /usr/sbin/groupadd -o --gid 399 group399
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.109153: [debug] Process finished in 7ms: /usr/sbin/groupadd -o --gid 399 group399
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.109306: [debug] Run process: /usr/sbin/groupadd -o --gid 701 group701
@(System/Process/Log.hs:37:3)
2018-04-24 10:56:49.117319: [debug] Process finished in 7ms: /usr/sbin/groupadd -o --gid 701 group701
@(System/Process/Log.hs:44:3)
2018-04-24 10:56:49.119055: [debug] Decoding build plan from: /Users/christiankjaerlaustsen/.stack/build-plan/lts-9.21.yaml
@(Stack/Snapshot.hs:150:5)
2018-04-24 10:56:49.119212: [debug] Trying to decode /Users/christiankjaerlaustsen/.stack/build-plan-cache/lts-9.21.cache
@(Data/Store/VersionTagged.hs:66:5)
2018-04-24 10:56:49.132586: [debug] Success decoding /Users/christiankjaerlaustsen/.stack/build-plan-cache/lts-9.21.cache
@(Data/Store/VersionTagged.hs:70:13)
2018-04-24 10:56:49.133008: [debug] Getting system compiler version
@(Stack/Setup.hs:387:17)
No information found for ghcjs-0.2.1.9009021_ghc-8.0.2.
Supported versions for OS key 'source': GhcjsVersion 0.1.0.20150924 7.10.2
2018-04-24 12:56:46.033052: [debug] Run process: /usr/local/bin/docker rm -f 791fe386a759de5b23f7bf62a2cca15bdfa540287528024ec9931c4c69b4d913
@(System/Process/Log.hs:37:3)
2018-04-24 12:56:46.109114: [debug] Process finished in 75ms: /usr/local/bin/docker rm -f 791fe386a759de5b23f7bf62a2cca15bdfa540287528024ec9931c4c69b4d913
@(System/Process/Log.hs:44:3)

退一步

我想,如果我们回到基础,我真正想问的是,堆栈在哪里/如何在 docker 镜像中找到 GHC,以及我如何指定 GHCJS 的路径?

因此,目前制作此镜像的 Dockerfile 相当简单。举个例子为 lts-9.21 构建 GHCJS 的那个,

FROM fpco/stack-build:lts-11.5

# Install node.js for GHCJS.
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash - \
 && apt-get update \
 && apt-get install -y nodejs \
 && rm -rf /var/lib/apt/lists/*

# Set up GHCJS.
COPY src /tmp/setup-ghcjs
RUN cd /tmp/setup-ghcjs \
 && stack setup --system-ghc \
 && rm -rf /tmp/setup-ghcjs

RUN mkdir -p /src
VOLUME /src
WORKDIR /src

这是做什么的

  • 使用fpco/stack-build:lts-11.5堆栈作为基础层,因为它包含cabal、stack等。
  • 然后安装 node.js,因为 GHCJS 需要它
  • 最后,它使用包含 stack.yaml 的项目构建 GHCJS。这看起来与我问题顶部的那个完全一样,当然去掉了 docker/system-ghc 部分。

现在,我想象会发生的是堆栈的 docker 支持会在使用图像时选择这个 ghcjs-0.2.1.9009021_ghc-8.0.2 编译器,但这似乎并没有发生.图像本身适用于例如docker run -v $(pwd):/src -it tehnix/ghcjs-docker:lts-9.21 stack build.

换句话说:如何让安装的 GHCJS 编译器可被发现以支持 stack 的 docker?

最佳答案

不确定这个用例经过了多少测试,所以它很可能不能直接工作。我注意到的一件事是您有 compiler-check: match-exact。虽然在某种程度上有这个很好,但这也意味着当您要求 ghcjs 二进制文件报告其版本时,它将需要产生您指定的确切版本号。不幸的是,很多时候这些二进制文件不是使用版本号的 9009021 部分构建的。

此外,您有 system-ghc: false,这意味着堆栈将不会使用它在环境中找到的编译器,而只会使用它已安装的编译器。与你想要的相反!尝试这样的事情怎么样(我还没有测试过):

解析器:lts-9.21 编译器:ghcjs-0.2.1.9009021_ghc-8.0.2 编译器检查:较新的次要 docker : 启用:真 repo: "tehnix/ghcjs-docker"# 会自动添加 :lts-x.xx 自动拉:真 系统-ghc:真

Unfortunately, stack will start looking for GHCJS on the host system, and therefore will not catch that GHCJS has already been built in the container image it's using.

我认为这不应该发生。如果它查找系统 ghcjs,则应在容器内完成。

关于docker - 使用 docker : true 时获取堆栈以获取 GHCJS 内置 docker 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49979697/

相关文章:

docker - 使用 docker 时如何执行 ../COPY

sqlite - Haskell-尝试查询刚刚创建的表时出现持久错误

algorithm - Haskell - 如何使用列表 monad 在井字游戏中生成下一步

Haskell 堆栈版本依赖关系

unit-testing - 使用 Haskell Stack 运行 detailed-0.9 测试套件时为 "module cannot be found locally"

haskell - 如何缓存 Haskell 依赖项以加快编译时间?

docker - 如果前端和后端位于kubernetes内的单独Pod和主机中,前端如何与后端通信?

inheritance - 当 child 定义另一个镜像时,Docker 父镜像的入口点会发生什么?

docker - 从 Spring Boot 应用程序连接到本地 Bitnami Docker Kafka 时出错

EclipseFP 根本不工作