草庐IT

Dockerfile常用命令

沛沛老爹 2023-12-11 原文

前言

Dockerfile是Docker用来构建镜像的文本文件,它包含了构建镜像的所有的指令以及对应的说明,有自定义的指令和格式, 可以通过docker build命令从Dockerfile中构建镜像。

Dockerfile制作原则

容器与Dockerfile制作相关的规则如下:

  • 基础镜像尽量首先使用官方镜像中的镜像;

  • FROM指令应该包含参数tag;

  • 编写指令时应该充分利用指令生成镜像层的原理,尽量安排相同的不变的放在前面;

  • ADD和COPY指令很相近,但推荐用COPY, ADD可以下载URL和自动下载文件解压并保留原文件,ADD指令用RUN wget或RUN curl代替;

  • RUN指令不要在一行中单独使用 RUN apt-get update,应该避免使用它,要用也必须把RUN apt-get update && RUN apt-get install写在同一行;

  • 不要在Dockerfile中做端口映射;

  • 由于容器名称唯一,如果容器要扩容,运行容器时就不能指字容器名称;

  • 一容器一进程;

  • 入口运行程序必须SUSPEND;

  • 对外部依赖的变量不能写死在Dockerfile里,最好通过变量在运行期间注入;

  • 日志目录通过volume挂载到外部;

  • 配置参数通过环境变量注入;

  • 带ONBUILD指令的必须带特殊标签;

  • Dockerfile有任何修改,必须修改tag;

Dockerfile示例

下面的这个示例是tomcat的,大家可以先看下对应的书写格式,后面我们会对每一项Dockerfile的命令进行说明。

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#

FROM amazoncorretto:17

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR

# see https://www.apache.org/dist/tomcat/tomcat-10/KEYS
# see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh)

ENV GPG_KEYS A9C5DF4D22E99998D9875A5110C01C5A2F6059E7

ENV TOMCAT_MAJOR 10
ENV TOMCAT_VERSION 10.1.0-M15
ENV TOMCAT_SHA512 b0eafe1599edf94dfa933dc857186dabbfbd80cfb2d9138f3120a48fd0172fc36c90a0243e92dd5163a5acc0336db617e978e6457698bcda700f0cb3e3e531dc

RUN set -eux; \
	\
# http://yum.baseurl.org/wiki/YumDB.html
	if ! command -v yumdb > /dev/null; then \
		yum install -y yum-utils; \
		yumdb set reason dep yum-utils; \
	fi; \
# a helper function to "yum install" things, but only if they aren't installed (and to set their "reason" to "dep" so "yum autoremove" can purge them for us)
	_yum_install_temporary() { ( set -eu +x; \
		local pkg todo=''; \
		for pkg; do \
			if ! rpm --query "$pkg" > /dev/null 2>&1; then \
				todo="$todo $pkg"; \
			fi; \
		done; \
		if [ -n "$todo" ]; then \
			set -x; \
			yum install -y $todo; \
			yumdb set reason dep $todo; \
		fi; \
	) }; \
	_yum_install_temporary gzip tar; \
	\
	ddist() { \
		local f="$1"; shift; \
		local distFile="$1"; shift; \
		local mvnFile="${1:-}"; \
		local success=; \
		local distUrl=; \
		for distUrl in \
# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
			"https://www.apache.org/dyn/closer.cgi?action=download&filename=$distFile" \
# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/
			"https://downloads.apache.org/$distFile" \
			"https://www-us.apache.org/dist/$distFile" \
			"https://www.apache.org/dist/$distFile" \
			"https://archive.apache.org/dist/$distFile" \
# if all else fails, let's try Maven (https://www.mail-archive.com/users@tomcat.apache.org/msg134940.html; https://mvnrepository.com/artifact/org.apache.tomcat/tomcat; https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/)
		${mvnFile:+"https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/$mvnFile"} \
		; do \
			if curl -fL -o "$f" "$distUrl" && [ -s "$f" ]; then \
				success=1; \
				break; \
			fi; \
		done; \
		[ -n "$success" ]; \
	}; \
	\
	ddist 'tomcat.tar.gz' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz"; \
	echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; \
	ddist 'tomcat.tar.gz.asc' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz.asc"; \
	export GNUPGHOME="$(mktemp -d)"; \
	for key in $GPG_KEYS; do \
		gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \
	done; \
	gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \
	tar -xf tomcat.tar.gz --strip-components=1; \
	rm bin/*.bat; \
	rm tomcat.tar.gz*; \
	command -v gpgconf && gpgconf --kill all || :; \
	rm -rf "$GNUPGHOME"; \
	\
# https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#Default_web_applications
	mv webapps webapps.dist; \
	mkdir webapps; \
# we don't delete them completely because they're frankly a pain to get back for users who do want them, and they're generally tiny (~7MB)
	\
	nativeBuildDir="$(mktemp -d)"; \
	tar -xf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \
	_yum_install_temporary \
		apr-devel \
		gcc \
		make \
		openssl11-devel \
	; \
	( \
		export CATALINA_HOME="$PWD"; \
		cd "$nativeBuildDir/native"; \
		aprConfig="$(command -v apr-1-config)"; \
		./configure \
			--libdir="$TOMCAT_NATIVE_LIBDIR" \
			--prefix="$CATALINA_HOME" \
			--with-apr="$aprConfig" \
			--with-java-home="$JAVA_HOME" \
			--with-ssl=yes \
		; \
		nproc="$(nproc)"; \
		make -j "$nproc"; \
		make install; \
	); \
	rm -rf "$nativeBuildDir"; \
	rm bin/tomcat-native.tar.gz; \
	\
# mark any explicit dependencies as manually installed
	find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' \
		| awk '/=>/ && $(NF-1) != "=>" { print $(NF-1) }' \
		| xargs -rt readlink -e \
		| sort -u \
		| xargs -rt rpm --query --whatprovides \
		| sort -u \
		| tee "$TOMCAT_NATIVE_LIBDIR/.dependencies.txt" \
		| xargs -r yumdb set reason user \
	; \
	\
# clean up anything added temporarily and not later marked as necessary
	yum autoremove -y; \
	yum clean all; \
	rm -rf /var/cache/yum; \
	\
# sh removes env vars it doesn't support (ones with periods)
# https://github.com/docker-library/tomcat/issues/77
	find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \
	\
# fix permissions (especially for running as non-root)
# https://github.com/docker-library/tomcat/issues/35
	chmod -R +rX .; \
	chmod 777 logs temp work; \
	\
# smoke test
	catalina.sh version

# verify Tomcat Native is working properly

RUN set -eux; \

	nativeLines="$(catalina.sh configtest 2>&1)"; \

	nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \

	nativeLines="$(echo "$nativeLines" | sort -u)"; \

	if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \

		echo >&2 "$nativeLines"; \

		exit 1; \

	fi

EXPOSE 8080

CMD ["catalina.sh", "run"]

Dockerfile常用命令

1、FROM

设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载

语法:FROM name:tag

FROM centos:7

2、MAINTAINER

镜像作者的信息,比如名字或邮箱地址

语法:MAINTAINER name

MAINTAINER zhangsan/zhangsan@baidu.com

3、RUN

构建镜像时运行的shell命令

语法:

  • 调用/bin/sh -c command
    RUN command
RUN yum -y install httpd
RUN cd /etc/yum.repos.d/ \
    && yum -y install wget \
    && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
    && wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm \
    && yum localinstall -y mysql57-community-release-el7-8.noarch.rpm \
    && yum clean all \
    && yum makecache
  • 调用exec执行,以避免有些时候shell方式执行时的传递参数问题
    RUN [“executable”, “param1”, “param2”]
RUN["yum","install","httpd"]

4、CMD

CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。

语法:

  • 调用exec执行,首选方式
    CMD [“executable”, “param1”, “param2”]

  • 当使用ENTRYPOINT指令时,为该指令传递默认参数
    CMD [“param1”, “param2”]

  • 调用/bin/sh -c执行
    CMD command [ param1 | param2 ]

**注意**:RUN和CMD都是执行命令,他们的差异在于RUN中定义的命令会在执行docker build命令创建镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。

CMD ["/bin/bash"] 或shell

5、EXPOSE

声明容器的服务端口
语法:EXPOSE port

EXPOSE 80 443

6、ADD

拷贝文件或目录到镜像容器内,如果是URL或压缩包会自动下载或自动解压

语法:ADD <源文件> <目标目录>

ADD[“源文件”,”目标目录”]
ADD target/demo.jar demo.jar

注意:

  • 如果执行docker build – < somefile即通过标准输入来创建时,ADD指令只支持url方式,另外如果url需要认证,则可以通过RUN wget …或RUN curl …来完成,ADD指令不支持认证。

  • <源文件>路径必须与Dockerfile在同级目录或子目录中,例如不能使用ADD …/somepath,因为在执行docker build时首先做的就是把Dockerfile所在目录包含子目录发送给docker的守护进程。

  • 如果 <源文件>是一个url且<目标目录>不是以”/“结尾,则会下载文件并重命名为<目标目录>。

  • 如果 <源文件>是一个url且<目标目录>以“/”结尾,则会下载文件到<目标目录>/,url必须是一个正常的路径形式,“http://baidu.com”像这样的url是不能正常工作的。

  • 如果 <源文件>是一个本地的压缩包且<目标目录>是以“/”结尾的目录,则会调用“tar -x”命令解压缩,如果<目标目录>有同名文件则覆盖,但 <源文件>是一个url时不会执行解压缩

7、COPY

拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能

语法:COPY <源文件> <目标目录>

COPY target/demo.jar demo.jar

8、ENV

设置容器的环境变量

语法:COPY <源文件> <目标目录>

ENV LC_ALL zh_CN.UTF-8

ENV MYSQL_PORT 3306

ENV MYSQL_DBNAME db_name

ENV MYSQL_SERVER 127.0.0.1

注意:

ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env =参数来修改。

9、ENTRYPOINT

语法:ENTRYPOINT command param1 param2

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT[“/bin/bash”,”-c”,”command”]

ENTRYPOINT /bin/bash -c ‘command’

ENTRYPOINT ["sh","-c","java -jar -Xms256M -Xmx512M /app.jar"]

ENTRYPOINT /bin/sh -c /etc/init.d/start.sh
  • ENTRYPOINT指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT指令,则只有最后一个指令有效。

  • ENTRYPOINT指令中指定的命令(exec执行的方式)可以通过docker run来传递参数,例如docker run images -l启动的容器将会把-l参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(如果有的话),但不会覆盖该指令定义的参数,例如ENTRYPOINT [“ls”,“-a”],CMD [“/etc”],当通过docker run image启动容器时该容器会运行ls -a /etc命令,当使用docker run image -l启动时该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。

注意:

  • 当使用ENTRYPOINT指令时生成的镜像运行时只会执行该指令指定的命令。

  • 当出现ENTRYPOINT指令时CMD指令只可能(当ENTRYPOINT指令使用exec方式执行时)被当做ENTRYPOINT指令的参数使用,其他情况则会被忽略。

10、VOLUME

VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移,具体用法请参考其他文章。

数据卷是一个特殊的文件或者目录,它将宿主机文件或者目录直接映射进容器中,可供一个或多个容器使用。容器数据卷设计的目的就是为了数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理

语法:VOLUME [“samepath”]

VOLUME ["/logs","/uploadPath"]

启动容器时指定路径:

docker run -d --restart=always \
--name app1 \
-v /home/app1/logs:/logs \
-v /home/app1/uploadPath:/uploadPath \
-p $port:8080 app:[tag]

11、USER

USER指令用于设置用户或uid来运行生成的镜像和执行RUN,CMD和ENTYRYPOINT执行命令。

语法:USER [username|uid]

USER [username|uid]

12、WORKDIR

WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。

语法:WORKDIR /path/to/workdir

WORKDIR: /var/lib/mysql

13、ONBUILD

ONBUILD指令用来设置一些触发的指令,用于在当该镜像被作为基础镜像来创建其他镜像时(也就是Dockerfile中的FROM为当前镜像时)执行一些操作,ONBUILD中定义的指令会在用于生成其他镜像的Dockerfile文件的FROM指令之后被执行,上述介绍的任何一个指令都可以用于ONBUILD指令,可以用来执行一些因为环境而变化的操作,使镜像更加通用。

语法:ONBUILD [INSTRUCTION]

ONBUILD RUN [ "npm", "install" ]

注意

  • ONBUILD中定义的指令在当前镜像的build中不会被执行。

  • 可以通过查看docker inspeat image命令执行结果的OnBuild键来查看某个镜像ONBUILD指令定义的内容。

  • ONBUILD中定义的指令会当做引用该镜像的Dockerfile文件的FROM指令的一部分来执行,执行顺序会按ONBUILD定义的先后顺序执行,如果ONBUILD中定义的任何一个指令运行失败,则会使FROM指令中断并导致整个build失败,当所有的ONBUILD中定义的指令成功完成后,会按正常顺序继续执行build。

  • ONBUILD中定义的指令不会继承到当前引用的镜像中,也就是当引用ONBUILD的镜像创建完成后将会清除所有引用的ONBUILD指令。

  • ONBUILD指令不允许嵌套,例如ONBUILD ONBUILD ADD . /data是不允许的。

  • ONBUILD指令不会执行其定义的FROM或MAINTAINER指令。

注意事项

  • Dockerfile的文件名是Dockerfile,不能写错,否则识别不了;

  • 所有的命令都用大写,并且都要跟参数

  • RUN指令exec格式中的参数会当成JSON数据被Docker解析,所以必须使用双引号而不能使用单引号;

  • RUN指令在构建镜像时执行指令,并生成新的镜像;

  • CMD指令在构建镜像时并不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令;

  • ONBUILD指令应该使用特殊的标签:

    • 在构建过程中,ONBUILD指令会添加到触发器指令镜像元数据库,这些触发指令不会在当前构建过程中执行;

    • 在构建过程最后,触发器指令会被存储在镜像详情中,其主键是OnBuild,可以使用docker inspect命令查看;

    • 之后该镜像可能作为其他Dockerfile中的FROM指令的参数。在构建过程中,FROM指令会寻找ONBUILD触发器指令,并且会以它们注册的顺序执行。若有触发器指令执行失败,则FROM指令被中止,并返回失败;若所有触发器指令执行成功,则FROM指令完成并继续执行下面的执行。在镜像构建完成之后,触发器指令会被清除,不会被子镜像继承。

    • 使用包含ONBUILD指令的Dockerfile构建的镜像应该有特殊的标签,如demo:2.0-onbuild.

总结

命令用途示例
FROM来源于哪个基础镜像哪个tagFROM centos:7
MAINTAINER作者信息zhangsan
RUN容器构建时需要运行的命令:
支持两种格式 shell: yum isntall -y vim
exec: [“可执行文件”,“参数”]
RUN yum isntall -y vim
EXPOSE对外暴露端口EXPOSE 80
WORKDIR容器创建后,终端默认登录进来的工作目录WORKDIR /home/admin
USER指定该镜像以什么用户去执行 默认为rootUSER admin
ENV运行时环境变量ENV JAVA_HOME /usr/local/java/openJDK11
VOLUME配置容器数据卷挂载VOLUME /tmp
ADD将宿主机目录下的文件拷贝进镜像并且会自动处理URL和解压tar包 ,等于copy+解压ADD spring-boot-demo.jar demo.jar
COPY将源文件从宿主机拷贝到容器内COPY spring-boot-demo.jar demo.jar
CMD在执行docker run时候执行,可以有多个cmd指令但是只有最后一个生效, docker run的参数会覆盖 cmd的参数,一般可变参数用cmd
支持两种格式
shell: yum isntall -y vim
exec: [“可执行文件”,“参数”]
CMD /bin/bash; CMD echo “success”
ENTRYPOINT也是用来指定容器启动时要执行的命令,类似cmd 但是不会被 run 后的参数命令覆盖,固定参数一般用ENTRY_POINT, 当CMD和ENTRYPOINT联用时,cmd多用于给ENTRYPOINT传参ENTRYPOINT [“java”,“-jar”,“/demo.jar”]

有关Dockerfile常用命令的更多相关文章

  1. 华为常用命令 - 2

    system-view进入系统视图quit退到系统视图sysname交换机命名vlan20创建vlan(进入vlan20)displayvlan显示vlanundovlan20删除vlan20displayvlan20显示vlan里的端口20Interfacee1/0/24进入端口24portlink-typeaccessvlan20把当前端口放入vlan20undoporte1/0/10删除当前VLAN端口10displaycurrent-configuration显示当前配置02配置交换机支持TELNETinterfacevlan1进入VLAN1ipaddress192.168.3.100

  2. dockerfile - 2

    文章目录一、概念1.1什么是dockerfile?1.2为什么要使用dockerfile1.3dockerbuild工作原理1.4dockerfile常用指令二、docker镜像制作2.1基于现有镜像创建2.2基于本地模板创建2.3基于dockerfile创建2.3.1CMD与entrypoint2.3.2使用exec模式是无法输出环境变量2.4shell模式需要加解释器2.5dockerfile构建tomcat镜像总结引言:docker创建镜像一、概念1.1什么是dockerfile?dockerfile是一个文本文件,其中包含了一条条指令(instruction),用于构建镜像。每一条指令

  3. git常用命令 - 2

    gitclonehttp:www.git.com.cn........ 克隆git项目gitbranch 查看分支gitbranch-r查看远程分支gitpushorigin--delete分支名 删除远程分支tmpgitcheckout切换分支gitcheckout-b切换并创建分支gitcheckout-b分支名origin/分支名(如果远程分支已存在最好用此命令,在创建分支时会把远程分支最新代码一并拉下来,不会把原分支代码带过来)gitbranch-D删除分支gitpushorigin--delete分支名gitpush--set-upstreamorigin分支名 推送本地分支到远端g

  4. Docker部署java项目(Dockerfile方式) - 2

    Java项目如何部署到Docker中?如何将java项目部署到Docker中呢,这里以一个springboot为例以下命令全部都是以linux为基础的1.首先找一个你熟悉的目录下创建一个目录upload(这个目录可以随便),并把java的linux和jar包上传进去我这里用的是jdk-8u321-linux-x64.tar.gz你可以从官网上进行下载#创建一个目录,然后所有的操作都是在这个目录中进行的。#这里目录的名字可以随便起mkdirupload#这里上传jdk,你可以使用xftp上传文件,我这里就不做演示了[root@zhupload]#ll总用量160408-rw-r--r--.1ro

  5. linux - Dockerfile 在构建时找不到 shell 脚本 - 2

    这个问题在这里已经有了答案:Areshellscriptssensitivetoencodingandlineendings?(14个答案)关闭3年前。我正在尝试通过docker构建一个使用go的应用程序。要安装go,dockerfile具有以下命令(顺便说一下,这执行得很好):RUNwgethttps://dl.google.com/go/go1.11.linux-amd64.tar.gz\&&tar-xfgo1.11.linux-amd64.tar.gz\&&mvgo/usr/local当脚本运行“install”子目录中的shell文件时会出现问题。注意,以下两步的输出:Step

  6. docker - 在Dockerfile和docker-compose.yml中编写什么以在docker环境中传递本地包 - 2

    我为服务器端api引入了localpackage和gomodules。通过命令gorunmain.go,它在本地环境中运行良好,没有错误。但是在命令docker-composeup时不起作用。我想知道编写Dockerfile和docker-compose.yml来修复什么。我在article目录下命令gomodinit。因此,它在go.mod中设置了modulegithub.com/jpskgc/article。article├db├client├api│├main.go│├controller││└controller.go│└Dockerfile├nginx├docker-comp

  7. 带有Go的Dockerfile找不到路径 - 2

    我在运行本地构建以及配置Dockerfile时遇到了问题。我的项目结构如下:project-cmdmain.go-internal-appapp.goDockerfile所以,在main.go中,我说import("project/internal/app")然后,当我说gobuild时,我可以在本地完美运行。但是,在我的Dockerfile中我说FROMgolangENVGOPATH/go/src/github.com/projectCOPY./go/src/github.com/projectWORKDIR/go/src/github.com/projectRUNmakelinux

  8. Git的常用命令介绍 - 2

    Git整体工作流程:Workspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、版本仓库: 1.通过命令gitinit把这个目录变成git可以管理的仓库(这就欧科啦)(会生成.git文件)默认.git文件不显示2.gitadd xxxxx (将工作区的指定文件添加到暂存区中)              没有任何提示,说明已经添加成功了3.gitcommit-m ‘一些提交注释’(把文件提交到本地仓库)4.gitstatus (查看是否有文件没有被提交)     展示说明没有任何文件未提交,但是我现在继续来改下readme.txt内

  9. ubuntu - Dockerfile 连接到 ODBC(例如 HPE Vertica)设置 - 2

    我有一个简单的GO程序可以成功连接到我的ubuntu服务器中的Vertica。我已经在这个ubuntu中设置了.dobc.ini和odbcdrvier。db,err:=sql.Open("odbc","DSN=HPVerticaDSN")iferr!=nil{log.Fatal(err)}log.Println("DBpingstarted...")iferr=db.Ping();err!=nil{log.Fatalf("DBpingfailedwitherror...%v",err)}log.Println("DBconnected.")deferdb.Close()现在,我如何设置

  10. docker - 为 golang 的 dockerfile 查找路径时出错 - 2

    我正在尝试用我的golang项目构建docker镜像我使用以下内容#buildstageFROMgolang:alpineasbuilderWORKDIR/go/src/appCOPY..RUNCGO_ENABLED=0GOOS=linuxgobuild-a-installsuffixcgo-ldflags'-extldflags"-static"'-omain.RUNapkadd--no-cachegit#finalstageFROMalpine:latestRUNapk--no-cacheaddca-certificatesCOPY--from=builder/go/bin/app

随机推荐