wsl2中使用docker安装和使用Foundry踩坑及解决方案

1.在 WSL2 (Windows Subsystem for Linux version 2) 中安装 Docker

主要涉及两个部分:安装 Docker Desktop for Windows 并配置它以在 WSL2 上运行,以及在 WSL2 中设置 Docker 客户端。以下是详细步骤:

第一步:安装 Docker Desktop for Windows

  1. 下载 Docker Desktop for Windows:访问 Docker 官网 并下载 Docker Desktop for Windows 的安装程序。

  2. 安装 Docker Desktop:运行下载的安装程序并按照提示完成安装过程。

  3. 启用 WSL2 功能:安装过程中确保启用了 WSL2 支持选项。Docker Desktop 安装完成后,它将要求你启用 WSL2(如果你尚未启用)。

第二步:配置 Docker Desktop 以使用 WSL2

  1. 启动 Docker Desktop:安装完成后,启动 Docker Desktop。

  2. 前往设置:在 Docker Desktop 的右下角,找到齿轮图标并点击进入“设置”。

  3. 选择 WSL2:在设置菜单中,选择“General(常规)”选项,并确保勾选了“Use the WSL 2 based engine(使用基于 WSL 2 的引擎)”复选框。

  4. 选择 Linux 发行版:转到“Resources(资源)” > “WSL Integration(WSL 集成)”,在这里,你可以选择你想要 Docker Desktop 在其上运行的特定 Linux 发行版。

  5. 应用 & 重启:完成配置后,点击“Apply & Restart(应用并重启)”使设置生效。

第三步:在 WSL2 中安装和配置 Docker 客户端(可选)

虽然 Docker Desktop 已经可以在 Windows 和 WSL2 环境中工作了,但如果你希望直接在 WSL2 的终端中使用 Docker 命令,你还需要在 WSL2 的 Linux 发行版中安装 Docker 客户端。

  1. 打开 WSL2 终端:启动你的 WSL2 Linux 发行版。

  2. 安装 Docker 客户端:根据你的 Linux 发行版,运行相应的安装命令。例如,在 Ubuntu 上,你可以使用以下命令:

    sudo apt update && sudo apt install docker.io -y
    
  3. 配置非 root 用户使用 Docker(可选):默认情况下,只有 root 用户或使用 sudo 的用户才能运行 Docker 命令。如果你想允许非 root 用户直接运行 Docker 命令,执行以下步骤:

    sudo groupadd docker
    sudo usermod -aG docker $USER
    newgrp docker
    
  4. 测试 Docker 命令:重新打开终端或注销并重新登录,然后尝试运行 docker run hello-world 来验证安装。

注意

  • 确保你的 Windows 10 版本支持 WSL2 和 Docker Desktop。
  • 如果你在使用 Docker 客户端时遇到权限问题,确保正确配置了用户组权限。
    通过以上步骤,你应该能够在 WSL2 中顺利使用 Docker 进行开发和测试工作。

2 获取Foundry镜像及安装

1. Foundry官网docker镜像拉取命令介绍及容器中如何使用forge

1.1 foundry容器命令使用踩坑及解决方案

问题1. docker run foundry "forge init --no-git /test"

Initializing /test... Installing forge-std in /test/lib/forge-std (url: Some("https://github.com/foundry-rs/forge-std"), tag: None) Cloning into '/test/lib/forge-std'... fatal: unable to access 'https://github.com/foundry-rs/forge-std/': Could not resolve host: github.com Error:git clone exited with code 128

这个错误提示 fatal: unable to access 'https://github.com/foundry-rs/forge-std/': Could not resolve host: github.com 指出 Docker 容器内无法解析 github.com 的域名。这个问题通常与 DNS 解析或网络连接相关。🔍

为了解决这个问题,我们可以尝试以下几个步骤:

1. 检查网络连接

首先,确保你的 Docker 主机能够正常访问互联网。你可以尝试在 Docker 主机上运行 ping github.com 来检查网络连接。

2. 检查 Docker 的 DNS 设置

Docker 容器的 DNS 问题可能导致域名解析失败。你可以尝试修改 Docker 容器的 DNS 设置,使用如 Google 的公共 DNS 服务器(8.8.8.8 和 8.8.4.4)。

3. 使用 Dockerfile 并指定 DNS

如果你正在使用 Dockerfile,可以在其中指定 DNS 服务器,例如:

FROM foundry
RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf
RUN forge init --no-git /test

这个方法可以确保在构建过程中使用正确的 DNS 设置。

4. 使用 Docker 运行时的 --dns 选项

当你运行 Docker 容器时,可以通过 --dns 选项指定 DNS 服务器,例如:

docker run --dns 8.8.8.8 foundry "forge init --no-git /test"

这样可以在运行容器时覆盖默认的 DNS 设置。

5. 检查防火墙和安全软件设置

确保没有防火墙或安全软件阻止 Docker 容器访问网络。你可能需要在这些工具中设置例外,允许 Docker 容器访问 github.com

问题2. docker run --dns 8.8.8.8 foundry " forge init hello_foundry"

Initializing /hello_foundry... Error: failed to commit (code=Some(128), stdout="", stderr="Author identity unknown\n\n*** Please tell me who you are.\n\nRun\n\n git config --global user.email \"you@example.com\"\n git config --global user.name \"Your Name\"\n\nto set your account's default identity.\nOmit --global to set the identity only in this repository.\n\nfatal: unable to auto-detect email address (got 'root@1d63e28f36cc.(none)')")

步骤 1: 创建 init_foundry.sh
  1. 在当前目录创建该脚本
#!/bin/sh
git config --global user.email "your-github-email"
git config --global user.name "your-github-username"
forge init hello_foundry
  1. ,你已经创建了一个脚本 init_foundry.sh,它首先配置 Git 用户信息,然后使用 forge init 命令初始化一个新的 Foundry 项目。要在 Docker 容器中运行这个脚本,你需要创建一个 Dockerfile 来构建一个新的 Docker 镜像,该镜像包含了你的脚本,并且配置了所需的环境。然后,你可以运行这个镜像来执行 init_foundry.sh 脚本。

以下是如何步骤化做到这一点:

步骤 2: 创建 Dockerfile
  1. init_foundry.sh 脚本所在的目录中创建一个名为 Dockerfile 的文件。
  2. 编辑 Dockerfile,添加以下内容:
FROM foundry
# 安装 git
RUN apk update && apk add --no-cache git

# 将 init_foundry.sh 脚本复制到容器中
COPY init_foundry.sh /init_foundry.sh

# 使脚本可执行
RUN chmod +x /init_foundry.sh

# 运行脚本
CMD ["/init_foundry.sh"]

这个 Dockerfile 做了几件事情:

  • foundry 基础镜像开始构建新镜像。
  • 安装 git,因为脚本中需要使用到 git 命令。
  • 将你的脚本复制到镜像中,并确保它是可执行的。
  • 定义容器启动时运行的命令为你的脚本。

注意 这里只是记录下为什么用apk,不感兴趣的可以直接跳到步骤3继续

其实一开始我用的是apt-get 并非 apk 命令,但是由于foundry镜像底层基础镜像并不是Ubuntu,而是Alpine Linux,所以才用了apk
首先,我们需要确认 foundry 镜像的基础系统。如果是基于 Alpine Linux,那么应该使用 apk 来安装软件包;如果是基于其他非 Debian/Ubuntu 系统,那么需要使用相应的包管理器。

如果基础镜像是 Alpine Linux

修改你的 Dockerfile,使用 apk 而不是 apt-get

FROM foundry
# 安装 git
RUN apk update && apk add --no-cache git

# 将 init_foundry.sh 脚本复制到容器中
COPY init_foundry.sh /init_foundry.sh

# 使脚本可执行
RUN chmod +x /init_foundry.sh

# 运行脚本
CMD ["/init_foundry.sh"]

如果不确定基础镜像系统

你可以先尝试运行一个容器来检测其包管理系统:

docker run -it foundry /bin/sh

一旦进入容器,你可以尝试运行 apt-getapkyum 等命令来看哪个是可用的。找到正确的包管理器后,按照上面的示例修改你的 Dockerfile

记住,每次修改 Dockerfile 后,你都需要重新构建 Docker 镜像:

docker build -t foundry-init .

再次运行容器,看看是否能够成功安装 Git 并执行你的脚本:

docker run foundry-init
步骤 3: 构建 Docker 镜像

在包含 Dockerfileinit_foundry.sh 脚本的目录中,运行以下命令来构建 Docker 镜像:

docker build -t foundry-init .

这将根据 Dockerfile 的指令构建一个新的 Docker 镜像,并使用标签 foundry-init 来标记这个镜像。

步骤 4: 运行 Docker 容器

完成镜像构建后,你可以运行这个镜像来执行你的脚本:

docker run --dns=8.8.8.8  -it foundry-init

这个命令将启动一个基于 foundry-init 镜像的容器,容器启动时会执行你的 init_foundry.sh 脚本,初始化 Foundry 项目。

3.确认开发方式并进行代码编写

使用 Foundry 进行智能合约开发时,选择最佳的开发方式取决于你的个人喜好、团队协作需求以及项目的具体要求。下面是两种方法的比较,以及我的推荐:

直接在 Docker 容器内部开发

优点

  • 环境一致性:确保所有开发者和 CI/CD 环境使用完全相同的开发环境,减少了“在我机器上能运行”这类问题。
  • 依赖管理:所有的依赖都被包含在容器内,简化了依赖管理。

缺点

  • 数据持久性:如果不挂载数据卷,容器停止后更改的内容会丢失,因为 Docker 容器的文件系统是临时的。
  • 开发流程:可能需要频繁地进入和退出 Docker 容器来进行开发工作,对某些开发者来说可能稍显繁琐。

使用挂载的数据卷映射本地目录

优点

  • 便捷性:允许你直接在宿主机上使用喜欢的编辑器和工具链进行开发,而不必进入 Docker 容器内部。
  • 数据持久性:代码和更改被存储在宿主机上,不受容器生命周期的影响。

缺点

  • 环境差异:需要确保宿主机上的工具和容器内保持一致,否则可能会引入环境差异。

我的推荐

对于大多数开发场景,我推荐使用挂载的数据卷映射本地目录的方法进行开发。这种方式结合了 Docker 提供的环境隔离和一致性优点,同时保留了在本地直接编辑和管理代码的便捷性。你可以在宿主机上使用任何喜欢的编辑器进行开发,同时确保编译和测试运行在与生产环境相同的配置中。

如果你不挂载数据卷且直接在容器内部开发,容器停止或删除后,所有未持久化的更改都会丢失。因此,对于需要长期开发的项目,挂载数据卷是一个更安全、更方便的选择。

最后,不管你选择哪种方式,都强烈建议将代码存储在版本控制系统(如 Git)中,这不仅是为了代码的持久化,也方便团队协作和版本管理。

当你使用 Docker 容器并通过挂载的数据卷与宿主机共享目录时,容器中对这些挂载目录的更改确实会实时同步到宿主机的对应目录。这意味着,你在容器内部对挂载的数据卷进行的任何写操作,比如创建、修改或删除文件,都会立即反映到宿主机上,反之亦然。这项功能非常适用于开发环境,因为它允许你在宿主机上使用喜欢的编辑器编辑代码,然后在容器中编译和测试这些代码。

使用挂载的数据卷映射本地目录的方式示例

  1. 启动容器并挂载数据卷

    假设你已经有了一个包含 Foundry 的 Docker 镜像(如 foundry-init),并且想要挂载宿主机的目录到容器内部。你可以使用如下命令的方式启动容器:

    docker run --dns=8.8.8.8 -v /xxx任意的空文件夹目录xxx:/hello_foundry -it foundry-init /bin/sh
    

    这个命令会启动一个交互式的容器会话,并且挂载了指定的数据卷。/xxx任意的空文件夹目录xxx 是宿主机上的目录路径,/hello_foundry 是容器内的目标挂载点。

  2. 在容器内使用 forge 命令

    一旦容器启动并且你获得了命令行界面,你就可以在容器内部使用 forge 相关命令了。比如,你可以尝试编译智能合约、运行测试等:

    • 切换到项目目录(如果你的项目在挂载的数据卷内):

      cd /hello_foundry
      
    • 运行 forge 命令来编译智能合约:

      forge build
      
    • 或者运行测试:

      forge test
      
  3. 注意事项

    • 确保你的 Docker 镜像(如 foundry-init)包含了所有必要的 Foundry 工具链和依赖,以便在容器内部运行 forge 命令。
    • 如果你需要频繁地进入同一个容器来执行命令,考虑给容器命名(使用 --name 选项)并使用 docker start -ai <容器名> 来重新启动已停止的容器,而不是每次都创建一个新的。

通过这种方式,你可以在 Docker 容器中使用 forge 来开发和测试智能合约,同时利用数据卷的特性来确保容器内的工作与宿主机上的文件系统保持同步。

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值