在amd64上运行arm64的macOS中的docker

时间:2018-08-30 13:23:19

标签: linux macos docker x86-64 arm64

使用var FB = require('fb'); FB.options({ version: 'v2.7' }); fb = new FB.Facebook({}); var bcrypt = require('bcryptjs'); var UserService = require('../services/user.service'); var config = require('../config'); var jwt = require('jsonwebtoken'); _this = this exports.getFBLoginCredentials = async function (req, res, next) { try { let access_token = req.body.facebook_token; FB.setAccessToken(access_token); let facebookInfo = await new Promise(function (resolve, reject) { FB.api('me/', { locale: 'en_US', fields: 'first_name, last_name, email' }, function (response) { if (!response || response.error) { reject(Error('Facebook Auth failed')); } resolve(response); }); }); let user = await UserService.findUserByEmail(facebookInfo.email); if (user) { let updatedToken = await _createToken(user, 1); let updatedRefreshToken = await _createToken(user, 7); user.token = updatedToken; user.refreshToken = updatedRefreshToken; user.facebookToken = access_token; user.emailVerified = true; await UserService.updateUser(user); return res.status(200).json({ status: 200, data: user, message: "Successfully Retrieved data" });; } let userFields = { name: facebookInfo.first_name + ' ' + facebookInfo.last_name, email: facebookInfo.email, emailVerified: true, facebook_token: access_token } let createdUser = await UserService.createUser(userFields); return res.status(200).json({ status: 200, data: createdUser, message: "Successfully Retrieved data" }); } catch (error) { return res.status(400).json({ status: 400, message: error.message }); } } 在macOS(version 10.13.6)上测试vault项目的特定版本时,我创建了以下Dockerfile:

Docker 18.06.10-ce-mac73

容器出现了,我可以使用它并运行所有必需的测试,我唯一注意到的是在输出所有命令之前,我得到的是这样的东西:

FROM ubuntu
RUN apt-get update && apt-get install -y --no-install-recommends -q curl build-essential ca-certificates git net-tools netcat unzip jq
WORKDIR /vault
RUN mkdir -p /vault/bin && \
    cd /vault/bin && \
    curl -o vault.zip -sL https://releases.hashicorp.com/vault/0.9.0/vault_0.9.0_linux_arm64.zip && unzip vault.zip
ENV PATH="/vault/bin:${PATH}"
ENTRYPOINT /bin/bash

使用Linux(Ubuntu)的同事无法运行root@d2abe7afe964:/vault/bin# vault --version Unknown host QEMU_IFLA type: 40 Unknown host QEMU_IFLA type: 41 Unknown host QEMU_IFLA type: 40 Unknown host QEMU_IFLA type: 41 Unknown QEMU_IFLA_INFO_KIND ipip Unknown host QEMU_IFLA type: 40 Unknown host QEMU_IFLA type: 41 Unknown QEMU_IFLA_INFO_KIND ip6tnl Unknown host QEMU_IFLA type: 40 Unknown host QEMU_IFLA type: 41 Vault v0.9.0 ('bdac1854478538052ba5b7ec9a9ec688d35a3335') 命令,他得到的错误是:

vault

在详细检查之后,问题是Dockerfile使用vault_0.9.0_linux_arm64.zip而不是vault_0.9.0_linux_amd64.zip。错误地,正在使用exec error command failed 的二进制文件而不是必需的arm64的二进制文件,令我们感到惊讶的是,在macOS环境中该文件正在运行。

因此,我们想详细了解为什么会发生这种情况,以及是否有必要在需要时以“严格”或更多Linux“ like”方式运行容器?

1 个答案:

答案 0 :(得分:1)

因为MacOS(您的计算机)上的Docker带有Linux虚拟机(Docker容器需要Linux内核的某些功能才能运行,所以它不能单独在MacOS上运行)。该Linux VM已配置有QEMU和binfmt_misc,因此它可以运行 arm64 容器。同时,您的朋友计算机上的Docker在其本机Linux上运行(而不是通过VM),并且他的Linux配置不足以运行 arm64 容器。