![](/img/trans.png)
[英]Error : standard_init_linux.go:228: exec user process caused: exec format error
[英]Docker error: standard_init_linux.go:228: exec user process caused: exec format error
我能夠從 arm64 的 M1 Macbook 成功構建多架構映像。 這是我的 docker 文件並嘗試從 raspberrypi aarch64/arm64 運行,運行圖像時出現此錯誤: standard_init_linux.go:228: exec user process caused: exec format error
使用 python 文件編輯帖子:
FROM frolvlad/alpine-python3
RUN pip3 install docker
RUN mkdir /hoster
WORKDIR /hoster
ADD hoster.py /hoster/
CMD ["python3", "-u", "hoster.py"]
#!/usr/bin/python3
import docker
import argparse
import shutil
import signal
import time
import sys
import os
label_name = "hoster.domains"
enclosing_pattern = "#-----------Docker-Hoster-Domains----------\n"
hosts_path = "/tmp/hosts"
hosts = {}
def signal_handler(signal, frame):
global hosts
hosts = {}
update_hosts_file()
sys.exit(0)
def main():
# register the exit signals
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
args = parse_args()
global hosts_path
hosts_path = args.file
dockerClient = docker.APIClient(base_url='unix://%s' % args.socket)
events = dockerClient.events(decode=True)
#get running containers
for c in dockerClient.containers(quiet=True, all=False):
container_id = c["Id"]
container = get_container_data(dockerClient, container_id)
hosts[container_id] = container
update_hosts_file()
#listen for events to keep the hosts file updated
for e in events:
if e["Type"]!="container":
continue
status = e["status"]
if status =="start":
container_id = e["id"]
container = get_container_data(dockerClient, container_id)
hosts[container_id] = container
update_hosts_file()
if status=="stop" or status=="die" or status=="destroy":
container_id = e["id"]
if container_id in hosts:
hosts.pop(container_id)
update_hosts_file()
def get_container_data(dockerClient, container_id):
#extract all the info with the docker api
info = dockerClient.inspect_container(container_id)
container_hostname = info["Config"]["Hostname"]
container_name = info["Name"].strip("/")
container_ip = info["NetworkSettings"]["IPAddress"]
if info["Config"]["Domainname"]:
container_hostname = container_hostname + "." + info["Config"]["Domainname"]
result = []
for values in info["NetworkSettings"]["Networks"].values():
if not values["Aliases"]:
continue
result.append({
"ip": values["IPAddress"] ,
"name": container_name,
"domains": set(values["Aliases"] + [container_name, container_hostname])
})
if container_ip:
result.append({"ip": container_ip, "name": container_name, "domains": [container_name, container_hostname ]})
return result
def update_hosts_file():
if len(hosts)==0:
print("Removing all hosts before exit...")
else:
print("Updating hosts file with:")
for id,addresses in hosts.items():
for addr in addresses:
print("ip: %s domains: %s" % (addr["ip"], addr["domains"]))
#read all the lines of thge original file
lines = []
with open(hosts_path,"r+") as hosts_file:
lines = hosts_file.readlines()
#remove all the lines after the known pattern
for i,line in enumerate(lines):
if line==enclosing_pattern:
lines = lines[:i]
break;
#remove all the trailing newlines on the line list
if lines:
while lines[-1].strip()=="": lines.pop()
#append all the domain lines
if len(hosts)>0:
lines.append("\n\n"+enclosing_pattern)
for id, addresses in hosts.items():
for addr in addresses:
lines.append("%s %s\n"%(addr["ip"]," ".join(addr["domains"])))
lines.append("#-----Do-not-add-hosts-after-this-line-----\n\n")
#write it on the auxiliar file
aux_file_path = hosts_path+".aux"
with open(aux_file_path,"w") as aux_hosts:
aux_hosts.writelines(lines)
#replace etc/hosts with aux file, making it atomic
shutil.move(aux_file_path, hosts_path)
def parse_args():
parser = argparse.ArgumentParser(description='Synchronize running docker container IPs with host /etc/hosts file.')
parser.add_argument('socket', type=str, nargs="?", default="tmp/docker.sock", help='The docker socket to listen for docker events.')
parser.add_argument('file', type=str, nargs="?", default="/tmp/hosts", help='The /etc/hosts file to sync the containers with.')
return parser.parse_args()
if __name__ == '__main__':
main()
基於 MacOS 構建的“多架構”Python 解釋器旨在針對 MacOS-on-Intel 和 MacOS-on-Apple's-arm64。
與 Linux-on-Apple's-arm64或Linux-on-aarch64 絕對沒有二進制兼容性。 無論架構是否匹配,您都無法在 Linux 上運行 MacOS 可執行文件。
當您在操作系統/平台與您想要啟動容器的平台不同的機器(主機)中構建映像時,就會發生這種情況。
解決方案是使用相同的機器/操作系統(需要運行它/需要啟動容器)來構建 docker 映像。
就我而言,我在 OSX 主機中構建 NodeJS、Python、Nginx、redis 和 postgres 映像,並試圖從 Ubuntu debian 主機中的映像啟動容器。 我通過在 Ubuntu debian 中構建圖像並在同一平台(Ubuntu debian)中擴展容器來解決
如果 Docker 鏡像構建在 M1 芯片上並上傳以供 Fargate 部署,那么您會在 Fargate 中注意到此容器錯誤:
standard_init_linux.go:228: exec user process caused: exec format error
有幾種方法可以解決這個問題。 您可以:
docker buildx build --platform=linux/amd64 -t image-name:version .
FROM
語句FROM --platform=linux/amd64 BASE_IMAGE:VERSION
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.