文章目录
引言:docker创建镜像
dockerfile是一个文本文件,其中包含了一条条指令(instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
dockerfile 用于指示 docker image build 命令自动构建Image的源代码
是纯文本文件
示例:
docker build -f /path/Dockerfile
问题:在dockerhub中官方提供很多镜像已经能满足我们的所有服务了,为什么还需要自定义镜像
核心作用:日后用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行.还可以对官方镜像做扩展,以打包成我们生产应用的镜像。
完整镜像的结构图:

Dockerfile的格式
两种类型的行
以# 开头的注释行
由专用“指令(Instruction)”开头的指令行
由Image Builder顺序执行各指令,从而完成Image构建

docker build [选项] <上下文路径/URL/->
docker build 后面的.表示当前目录,也是指定上下文的路径
上下文:
Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API ,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。
当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?
这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
那么为什么会有人误以为.·是指定 Dockerfile 所在目录呢?这是因为在默认情况下,如果不额外指定 Dockerfile 的话,会将上下文目录下的名为 Dockerfile 的文件作为 Dockerfile。
这只是默认行为,实际上 Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f …/Dockerfile 参数指定某个文件作为 Dockerfile。
当然,一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。

指令的一般格式为 INSTRUCTION arguments,指令包括 FROM、MAINTAINER、RUN 等。
FROM
格式为 FROM 或FROM :。
第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER
格式为 MAINTAINER ,指定维护者信息。
格式:
MAINTAINER <name>
示例:
MAINTAINER bertwu
MAINTAINER xxx@163.com
MAINTAINER bertwu <xxx@163.com>
RUN
格式为 RUN 或 RUN [“executable”, “param1”, “param2”]。
前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”, “echo hello”]。
每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。
RUN用于在构建镜像时执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定--no-cache参数,如:docker build --no-cache
CMD
支持三种格式
CMD [“executable”,“param1”,“param2”] 使用
exec 执行,推荐方式;
CMD command param1 param2 在
/bin/sh 中执行,提供给需要交互的应用;
CMD [“param1”,“param2”] 提供给
ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -l
CMD ["/usr/bin/wc","--help"]
注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
EXPOSE
格式为 EXPOSE […]。
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注: EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
如果没有暴露端口,后期也可以通过-p 8080:80方式映射端口,但是不能通过-P形式映射
ENV
格式为 ENV 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
格式:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
ADD
格式为 ADD 。
该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
COPY
格式为 COPY 。
复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。
当使用本地目录为源目录时,推荐使用 COPY。
ENTRYPOINT
两种格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2(shell中执行)。
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["ls", "/usr/local"]
CMD ["/usr/local/tomcat"]
之后,docker run 传递的参数,都会先覆盖cmd,然后由cmd 传递给entrypoint ,做到灵活应用
注:ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,
而docker run命令中指定的任何参数,都会被当做参数再次传递给CMD。
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,
而只执行最后的ENTRYPOINT指令。
通常情况下, ENTRYPOINT 与CMD一起使用,ENTRYPOINT 写默认命令,当需要参数时候 使用CMD传参
VOLUME
格式为 VOLUME [“/data”]。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
USER
格式为 USER daemon。
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用 gosu,而不推荐 sudo。
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。
镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
WORKDIR
格式为 WORKDIR /path/to/workdir。
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY
等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
ONBUILD
格式为 ONBUILD [INSTRUCTION]。
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
NNBUID后面跟指令,当当前的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
== LABEL==
用于为镜像添加元数据
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据
之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
ARG
用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参
格式:
ARG <name>[=<default value>]
示例:
ARG site
ARG build_user=www
From centos:7
ARG parameter
VOLUME /usr/share/nginx
RUN yum -y install $parameter
EXPOSE 80 443
CMD nginx -g "daemon off;"
# 可以这如下这样灵活传参
docker build --build-arg=parameter=net-tools -t nginx:01 .
一般会有三种方式制作镜像
基于已有镜像创建
基于本地模板创建
基于Dockerfile创建(重点)
如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
如果有多个CMD,只有最后一个运行
如果有多个Entrypoint,只有最后一个运行
如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数
镜像制作分为两个阶段
1、docker build阶段 基于dockerfile制作镜像 (RUN,用于此阶段的运行命令)
2、docker run阶段 基于镜像运行容器 (CMD,基于image run容器时候,需要运行的命令)
3、docker build 基于第一阶段的镜像被别人from制作新镜像 (entrypoint 或onbuild 基于镜像重新构建新镜像时候在此阶段运行的命令)
首先启动一个镜像,在容器里做修改
docker images
docker create -it centos:7 bash
docker ps -a
将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
docker commit -m "new" -a "liu" ef8946b45860 centos:7
##commit 常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
docker images

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为:
https://wiki.openvz.org/Download/template/precrated
#下载debian压缩包
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

#生成镜像
[root@zhang ~]# docker import debian-7.0-x86-minimal.tar.gz -- debian:v1
sha256:8f6602e3f7241bc32a952ef741c67bc2f783a283d73e72592cb17f680001082e
#或
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:v1
#查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian v1 8f6602e3f724 13 seconds ago 215MB
#启动容器
[root@localhost ~]# docker run -itd debian:v1 bash
8b9df79ab0114fad81443ed598bfb159698c487c6c6b847e5b6e389c75e1b385
都是容器启动时要加载的命令
exec 模式 与shell模式
exec: 容器加载时使用的启动的第一个任务进程
shell: 容器加载时使用的第一个bash(/bin/bash /bin/sh /bin/init)
自检完成后,加载第一个pid = 1 进程
shell 翻译官/解释器,解析
echo $PATH
示例:
[root@docker /]# mkdir test
[root@docker /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
[root@docker /]# cd test/
[root@docker test]# vim Dockerfile
FROM centos:7
CMD ["top"]
[root@docker test]# ls
Dockerfile
[root@docker test]# docker build -t centos:7 .
[root@docker test]# docker run -it --name test centos:7
[root@docker test]# docker logs test
[root@docker test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c69f4d7ed56e centos:7 "top" 46 seconds ago Exited (0) 42 seconds ago test
[root@docker test]# docker start c6
c6
[root@docker test]# docker exec test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 56156 1952 pts/0 Ss+ 07:06 0:00 top
root 6 0.0 0.0 51732 1708 ? Rs 07:07 0:00 ps aux
[root@docker test]#

[root@docker test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c69f4d7ed56e centos:7 "top" 3 minutes ago Up 2 minutes test
[root@docker test]# docker run -itd --name test01 centos:7 /bin/bash
8023e16ef9e0537bf6b65003d7ebe086dd55462bb60a3cc6e982c4f328cb4b98
[root@docker test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8023e16ef9e0 centos:7 "/bin/bash" 8 seconds ago Up 8 seconds test01
c69f4d7ed56e centos:7 "top" 4 minutes ago Up 3 minutes test
[root@docker test]# docker exec test01 ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11828 1656 pts/0 Ss+ 07:10 0:00 /bin/bash
root 15 0.0 0.0 51732 1708 ? Rs 07:10 0:00 ps aux
[root@docker test]#

示例:exec 模式 (命令加选项+参数)
[root@docker test]# vim Dockerfile
[root@docker test]# cat Dockerfile
FROM centos:7
CMD ["echo","$HOME"]
[root@docker test]# echo $HOME
/root
[root@docker test]# docker build -t "centos:L" .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos:7
---> 8f74bbed8cbe
Step 2/2 : CMD ["echo","$HOME"]
---> Running in 491c18c05c0b
Removing intermediate container 491c18c05c0b
---> 688f4d154750
Successfully built 688f4d154750
Successfully tagged centos:L
[root@docker test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos L 688f4d154750 15 seconds ago 204MB
centos 7 8f74bbed8cbe 19 minutes ago 204MB
nginx 1.20 0584b370e957 2 months ago 141MB
centos <none> eeb6ee3f44bd 10 months ago 204MB
[root@docker test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8023e16ef9e0 centos:7 "/bin/bash" 8 minutes ago Up 8 minutes test01
c69f4d7ed56e centos:7 "top" 12 minutes ago Up 11 minutes test
[root@docker test]# docker run -itd --name liu centos:L
e5eb1e4e56ac1fc4f6c41606d3748ed0a89a81287c1aec5c92618d19edf4b232
[root@docker test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5eb1e4e56ac centos:L "echo $HOME" 8 seconds ago Exited (0) 7 seconds ago liu
41559f63b4e7 68 "echo $HOME" 2 minutes ago Exited (0) 2 minutes ago cool_kepler
8023e16ef9e0 centos:7 "/bin/bash" 12 minutes ago Up 12 minutes test01
c69f4d7ed56e centos:7 "top" 16 minutes ago Up 15 minutes test

[root@docker test]# vim Dockerfile
[root@docker test]# cat Dockerfile
FROM centos:7
CMD ["sh","-c","echo $HOME"]
[root@docker test]# docker build -t "centos:liu" .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos:7
---> 8f74bbed8cbe
Step 2/2 : CMD ["sh","-c","echo $HOME"]
---> Running in a41e53c86d41
Removing intermediate container a41e53c86d41
---> 339d6938ee5c
Successfully built 339d6938ee5c
Successfully tagged centos:liu
[root@docker test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos liu 339d6938ee5c 24 seconds ago 204MB
centos L 688f4d154750 10 minutes ago 204MB
centos 7 8f74bbed8cbe 29 minutes ago 204MB
nginx 1.20 0584b370e957 2 months ago 141MB
centos <none> eeb6ee3f44bd 10 months ago 204MB
[root@docker test]# docker run -itd --name l1 centos:liu
41bb7a5053a6e49bb29d4847a62fe154ee52901102736231b69a8484996a17fe
[root@docker test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41bb7a5053a6 centos:liu "sh -c 'echo $HOME'" 10 seconds ago Exited (0) 10 seconds ago l1
e5eb1e4e56ac centos:L "echo $HOME" 6 minutes ago Exited (0) 6 minutes ago liu
41559f63b4e7 68 "echo $HOME" 9 minutes ago Exited (0) 9 minutes ago cool_kepler
8023e16ef9e0 centos:7 "/bin/bash" 18 minutes ago Up 18 minutes test01
c69f4d7ed56e centos:7 "top" 23 minutes ago Up 22 minutes test
[root@docker test]# docker logs l1
/root
[root@docker test]#

cd /opt
mkdir tomcat
cd tomcat
===上传apache-tomcat-9.0.16.tar.gz、jdk-8u91-linux-x64.tar安装包===
cd /opt/tomcat
vim Dockerfile
FROM centos:7
MAINTAINER [lcdb]
ADD jdk-8u91-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.16.tar.gz /usr/local
WORKDIR /usr/local
RUN mv apache-tomcat-9.0.16 tomcat
RUN mv jdk1.8.0_91 java
ENV JAVA_HOME /usr/local/java
ENV CLASS_PATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
docker build -t tomcat:new .
docker images #查看镜像的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat new 8c285e2b491d 38 seconds ago 964MB #未优化
#运行容器,并指定端口映射
[root@zhang tomcat]# docker run -itd -p 9999:8080 tomcat:new
4146dcf57dec9bdabfd86bbfb6463c9f80454694d7cfd346f5e3ec7893461ace
[root@zhang tomcat]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4146dcf57dec tomcat:new "/usr/local/tomcat/b…" 15 seconds ago Up 14 seconds 0.0.0.0:9999->8080/tcp, :::9999->8080/tcp compassionate_jones
==真机访问==
http://宿主机ip:9999
dockerfile构建镜像前要创建一个工作目录
dockerfile构建镜像前要创建一个工作目录,docker build会扫描当前目录下所有文件
优化四种方式——》基于docker镜像分层的原理来的
① 每一条RUN 指令 都会生成一层新的镜像层
② 每一层镜像缓存会继承到下一层中 ——》直接影响到镜像的大小
文章目录一、概念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),用于构建镜像。每一条指令
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
这个问题在这里已经有了答案: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
我为服务器端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
我在运行本地构建以及配置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
我有一个简单的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()现在,我如何设置
我正在尝试用我的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
我的Go服务有点问题。我是Go的新手,我只想对一个连接到mongodb实例的小服务进行docker化。我的代码在本地运行良好。所以这是我的Dockerfile:#buildstageFROMgolang:alpineASbuild-envRUNapkadd--no-cachegitADD..RUNgoget-v-ugo.mongodb.org/mongo-driverRUNgobuild-omongotest#finalstageFROMalpineWORKDIR/appCOPY--from=build-env./go/mongotest.RUNapkupdate&&apkaddca-
我为服务器端api引入了带有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-compose.yml├go.
我正在尝试使用我的golang项目创建一个docker镜像。该项目有一些本地包,例如math:/myproject/src/main.goutils/math.go在main.go中,我包含了很多包,还有来自math.go的math。我的docker文件看起来像这样:FROMgolang:latestENVGOPATH=/golib/RUN/usr/local/go/bin/gogetgithub.com/julienschmidt/httprouterCMD/usr/local/go/bin/gorunmain.goEXPOSE10004因为它是一个本地包,所以我如何包含math包,