使用 debian:stretch-slim 在 Docker 中安装 csvtk 的问题

问题描述

我是 Docker 的新手,我正在尝试使用 import React,{ useEffect } from "react"; import clsx from "clsx"; import { makeStyles,useTheme } from "@material-ui/core/styles"; import Drawer from "@material-ui/core/Drawer"; import CssBaseline from "@material-ui/core/CssBaseline"; import AppBar from "@material-ui/core/AppBar"; import Toolbar from "@material-ui/core/Toolbar"; import List from "@material-ui/core/List"; import Typography from "@material-ui/core/Typography"; import Divider from "@material-ui/core/Divider"; import IconButton from "@material-ui/core/IconButton"; import MenuIcon from "@material-ui/icons/Menu"; import ChevronLeftIcon from "@material-ui/icons/ChevronLeft"; import ChevronRightIcon from "@material-ui/icons/ChevronRight"; import ListItem from "@material-ui/core/ListItem"; import ListItemIcon from "@material-ui/core/ListItemIcon"; import ListItemText from "@material-ui/core/ListItemText"; import InBoxIcon from "@material-ui/icons/MovetoInBox"; import MailIcon from "@material-ui/icons/Mail"; import Paper from "@material-ui/core/Paper"; const drawerWidth = 240; const useStyles = makeStyles((theme) => ({ root: { display: "flex" },appBar: { transition: theme.transitions.create(["margin","width"],{ easing: theme.transitions.easing.sharp,duration: theme.transitions.duration.leavingScreen }) },appBarShift: { width: `calc(100% - ${drawerWidth}px)`,marginLeft: drawerWidth,transition: theme.transitions.create(["margin",{ easing: theme.transitions.easing.eaSEOut,duration: theme.transitions.duration.enteringScreen }) },menuButton: { marginRight: theme.spacing(2) },hide: { display: "none" },drawer: { width: drawerWidth,flexShrink: 0 },drawerPaper: { width: drawerWidth },drawerHeader: { display: "flex",alignItems: "center",padding: theme.spacing(0,1),// necessary for content to be below app bar ...theme.mixins.toolbar,justifyContent: "flex-end" },content: { flexGrow: 1,padding: theme.spacing(3),transition: theme.transitions.create("margin",duration: theme.transitions.duration.leavingScreen }),marginLeft: -drawerWidth },contentShift: { transition: theme.transitions.create("margin",duration: theme.transitions.duration.enteringScreen }),marginLeft: 0 } })); export default function PersistentDrawerLeft() { const classes = useStyles(); const theme = useTheme(); const [open,setopen] = React.useState(false); const [html,setHtml] = React.useState(""); useEffect(() => { setHtml(`<!doctype html> <html> <head> <Meta charset="UTF-8"> <Meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no"> <title></title> <link href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css" rel="stylesheet"> <style> #table_wrapper{ overflow-x: hidden; } .mdc-data-table{ width: 100%; } </style> </head> <body> <table id="jEZeucEZQISp" class="display" style="width:100%"> <thead> <tr> <th>STATE</th> <th>CAPITAL</th> <th>WIKIPEDIA LINK</th> <th>VISITED</th> </tr> </thead> <tbody> </tbody> </table> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script> <script> var my_jquery = $.noConflict(true); my_jquery(document).ready(function(){ my_jquery('#jEZeucEZQISp').DataTable({ data: [["Alabama","Montgomery","https://en.wikipedia.org/wiki/Montgomery,_Alabama","TRUE"],["Alaska","Juneau","https://en.wikipedia.org/wiki/Juneau,_Alaska",["Arizona","Phoenix","https://en.wikipedia.org/wiki/Phoenix,_Arizona",["Arkansas","Little Rock","https://en.wikipedia.org/wiki/Little_Rock,_Arkansas",["California","Sacramento","https://en.wikipedia.org/wiki/Sacramento,_California",["Colorado","Denver","https://en.wikipedia.org/wiki/Denver,_Colorado",["Connecticut","Hartford","https://en.wikipedia.org/wiki/Hartford,_Connecticut",["Delaware","Dover","https://en.wikipedia.org/wiki/Dover,_Delaware","FALSE"],["Florida","Tallahassee","https://en.wikipedia.org/wiki/Tallahassee,_Florida",["Georgia","Atlanta","https://en.wikipedia.org/wiki/Atlanta,_Georgia",["Hawaii","Honolulu","https://en.wikipedia.org/wiki/Honolulu,_Hawaii",["Idaho","Boise","https://en.wikipedia.org/wiki/Boise,_Idaho",["Illinois","Springfield","https://en.wikipedia.org/wiki/Springfield,_Illinois",["Indiana","Indianapolis","https://en.wikipedia.org/wiki/Indianapolis,_Indiana",["Iowa","Des Moines","https://en.wikipedia.org/wiki/Des%20Moines,_Iowa",["Kansas","Topeka","https://en.wikipedia.org/wiki/Topeka,_Kansas",["Kentucky","Frankfort","https://en.wikipedia.org/wiki/Frankfort,_Kentucky",["Louisiana","Baton Rouge","https://en.wikipedia.org/wiki/Baton%20Rouge,_Louisiana",["Maine","Augusta","https://en.wikipedia.org/wiki/Augusta,_Maine",["Maryland","Annapolis","https://en.wikipedia.org/wiki/Annapolis,_Maryland",["Massachusetts","Boston","https://en.wikipedia.org/wiki/Boston,_Massachusetts",["Michigan","Lansing","https://en.wikipedia.org/wiki/Lansing,_Michigan",["Minnesota","St. Paul","https://en.wikipedia.org/wiki/St.%20Paul,_Minnesota",["Mississippi","Jackson","https://en.wikipedia.org/wiki/Jackson,_Mississippi",["Missouri","Jefferson City","https://en.wikipedia.org/wiki/Jefferson%20City,_Missouri",["Montana","Helena","https://en.wikipedia.org/wiki/Helena,_Montana",["Nebraska","Lincoln","https://en.wikipedia.org/wiki/Lincoln,_Nebraska",["Nevada","Carson City","https://en.wikipedia.org/wiki/Carson%20City,_Nevada",["New Hampshire","Concord","https://en.wikipedia.org/wiki/Concord,_New%20Hampshire",["New Jersey","Trenton","https://en.wikipedia.org/wiki/Trenton,_New%20Jersey",["New Mexico","Santa Fe","https://en.wikipedia.org/wiki/Santa%20Fe,_New%20Mexico",["New York","Albany","https://en.wikipedia.org/wiki/Albany,_New%20York",["north Carolina","Raleigh","https://en.wikipedia.org/wiki/Raleigh,_north%20Carolina",["north Dakota","Bismarck","https://en.wikipedia.org/wiki/Bismarck,_north%20Dakota",["Ohio","Columbus","https://en.wikipedia.org/wiki/Columbus,_Ohio",["Oklahoma","Oklahoma City","https://en.wikipedia.org/wikI/Oklahoma%20City,_Oklahoma",["Oregon","Salem","https://en.wikipedia.org/wiki/Salem,_Oregon",["Pennsylvania","Harrisburg","https://en.wikipedia.org/wiki/Harrisburg,_Pennsylvania",["Rhode Island","Providence","https://en.wikipedia.org/wiki/Providence,_Rhode%20Island",["South Carolina","Columbia","https://en.wikipedia.org/wiki/Columbia,_South%20Carolina",["South Dakota","Pierre","https://en.wikipedia.org/wiki/Pierre,_South%20Dakota",["Tennessee","Nashville","https://en.wikipedia.org/wiki/Nashville,_Tennessee",["Texas","Austin","https://en.wikipedia.org/wiki/Austin,_Texas",["Utah","Salt Lake City","https://en.wikipedia.org/wiki/Salt%20Lake%20City,_Utah",["Vermont","Montpelier","https://en.wikipedia.org/wiki/Montpelier,_Vermont",["Virginia","Richmond","https://en.wikipedia.org/wiki/Richmond,_Virginia",["Washington","Olympia","https://en.wikipedia.org/wikI/Olympia,_Washington",["West Virginia","Charleston","https://en.wikipedia.org/wiki/Charleston,_West%20Virginia",["Wisconsin","Madison","https://en.wikipedia.org/wiki/Madison,_Wisconsin",["Wyoming","Cheyenne","https://en.wikipedia.org/wiki/Cheyenne,_Wyoming","TRUE"]],idisplayLength: 25,"scrollX": false,scrollY: '',scrollCollapse: false,search: { search: "",},}); }); </script> </body> </html>`); },[]); const handleDrawerOpen = () => { setopen(true); }; const handleDrawerClose = () => { setopen(false); }; return ( <div className={classes.root}> <CssBaseline /> <AppBar position="fixed" className={clsx(classes.appBar,{ [classes.appBarShift]: open })} > <Toolbar> <IconButton color="inherit" aria-label="open drawer" onClick={handleDrawerOpen} edge="start" className={clsx(classes.menuButton,open && classes.hide)} > <MenuIcon /> </IconButton> <Typography variant="h6" Nowrap> Persistent drawer </Typography> </Toolbar> </AppBar> <Drawer className={classes.drawer} variant="persistent" anchor="left" open={open} classes={{ paper: classes.drawerPaper }} > <div className={classes.drawerHeader}> <IconButton onClick={handleDrawerClose}> {theme.direction === "ltr" ? ( <ChevronLeftIcon /> ) : ( <ChevronRightIcon /> )} </IconButton> </div> <Divider /> <List> {["InBox","Starred","Send email","Drafts"].map((text,index) => ( <ListItem button key={text}> <ListItemIcon> {index % 2 === 0 ? <InBoxIcon /> : <MailIcon />} </ListItemIcon> <ListItemText primary={text} /> </ListItem> ))} </List> <Divider /> <List> {["All mail","Trash","Spam"].map((text,index) => ( <ListItem button key={text}> <ListItemIcon> {index % 2 === 0 ? <InBoxIcon /> : <MailIcon />} </ListItemIcon> <ListItemText primary={text} /> </ListItem> ))} </List> </Drawer> <main className={clsx(classes.content,{ [classes.contentShift]: open })} > <div className={classes.drawerHeader} /> <Paper elevation={1} style={{ minHeight: "auto",height: "100vh" }} flex={1} overflow="auto" > <iframe id="widget" name="widget" title="widget" scrolling="yes" frameBorder="0" width="100%" height="100%" srcdoc={html} style={{ position: "relative",height: "100%" }} ></iframe> </Paper> </main> </div> ); } 通过 Docker 安装 csvtk

下面是我的debian:stretch-slim

Dockerfile

它在 FROM debian:stretch-slim RUN apt-get update \ && apt-get install -y --no-install-recommends \ jq \ perl \ python3 \ wget \ && rm -rf /var/lib/apt/lists/* RUN wget -qO- https://github.com/shenwei356/csvtk/releases/download/v0.23.0/csvtk_linux_amd64.tar.gz | tar -xz \ && cp csvtk /usr/local/bin/ 步骤失败并显示以下错误消息:

csvtk

如果您有任何帮助/建议,我将不胜感激。

提前致谢。

解决方法

wget 正在退出,错误代码意味着 wget 上的 5 SSL 验证失败。从 this answer 开始,您只需要在 ca-certificates 之前安装 wget

这个 Dockerfile 应该能成功构建:

FROM debian:stretch-slim
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    jq                 \
    perl               \
    python3            \
    wget               \
    # added this package to help with ssl certs in Docker
    ca-certificates    \
    && rm -rf /var/lib/apt/lists/*

RUN wget -qO- https://github.com/shenwei356/csvtk/releases/download/v0.23.0/csvtk_linux_amd64.tar.gz | tar -xz \
     && cp csvtk /usr/local/bin/

作为调试此类问题时的一般提示,最简单的方法可能是从 Dockerfile 中删除有问题的 RUN 行,然后尝试在 shell 中构建和运行容器并手动执行所需的命令。像这样:

docker build -t test:v1 .
docker run --rm -it test:v1 /bin/bash
# run commands manually and check the full error output

虽然将不同的 RUN 指令与 && 结合是减少图像层数的最佳做法,但在构建时很难调试。